博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python类的继承、多继承及其常用魔术方法
阅读量:6088 次
发布时间:2019-06-20

本文共 3527 字,大约阅读时间需要 11 分钟。

继承  

一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法。属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就是顶级基类object,它就相当于一个人的祖宗。当一个类没有写继承谁时,默认就是继承object。

class father(object):    def __init__(self):        self.name = "wang"        self.__age = 20    def A(self):        print(self.__age)class son(father):    passa = son()print(a.name)a.A()
wang20

上面代码中,son类继承了father类,所以可以直接使用父类的属性和方法。

多继承

一个类可以同时继承多个类,这个就是类的多继承。当继承多个父类时,如果父类中有相同的方法,那么子类会优先使用最先被继承的方法。下面的例子可以明显地看出来。

class father():    def __init__(self):        self.name = "wang"        self.__age = 20    def A(self):        print("this is father\'s method")class mother():    def __init__(self):        self.sex = "man"    def A(self):        print("this is mother\'s method")class son(father,mother):    passa = son()a.A()
this is father's method

当子类不想调用父类的方法,可以通过重写来覆盖父类的方法。

class father():    def __init__(self):        self.name = "wang"        self.__age = 20    def A(self):        print("this is father\'s method")class mother():    def __init__(self):        self.sex = "man"    def A(self):        print("this is mother\'s method")class son(father,mother):    def A(self):        print("this is my method")a = son()a.A()
this is my method

当子类重写父类方法后,若想再次调用父类方法,可以使用super()方法。还可以调用类的__mro__属性(返回元组)mro方法(返回列表)来获取类的继承关系。

class father():    def __init__(self):        self.name = "wang"        self.__age = 20    def A(self):        print("this is father\'s method")class mother():    def __init__(self):        self.sex = "man"    def A(self):        print("this is mother\'s method")class son(father,mother):    def A(self):        super().A()a = son()a.A()print(son.mro())print(son.__mro__)
this is father's method[
,
,
,
](
,
,
,
)

魔术方法

类的魔术方法有很多,所谓的魔术方法就是不需要自己调用,就可以自己再特定的时刻被自动调用,魔术方法的形式时__name__()。最常见的魔术方法就是初始化和析构了,下面介绍几种另外的魔术方法。

运算方法:运算方法可以实现类之间的运算,方便类之间的操作。

  1. __add__(self,other) #x + y
  2. __sub__(self,other)#x - y
  3. __mul__(self,other)#x * y
  4. __mod__(self,other)#x % y
  5. __iadd__(self,other)# x += y
  6. __isub__(self,other)# x -= y
  7. __radd__(self,other)#y + x
  8. __rsub__(self,other)#y - x
  9. __imul__(self,other)#x *= y
  10. __imod__(self,other)#x %= y
class A():    def __init__(self):        self.number = 20    def __add__(self,other):        return self.number + other.number    def __sub__(self,other):        return self.number - other.numberclass B():    def __init__(self):        self.number = 30a = A()b = B()print (a+b)print (a-b)
50-10

__call__方法:正常情况下,实例是不能像函数一样被调用的,但通过写__call__方法就能做到。

class A():    def __init__(self):        self.number = 20    def __call__(self):        print("this call method")a = A()a()
this call method

类中一些查询相关信息的方法,这些方法基本了解就行,实际中并不常用。

  • __class__  格式:实例.__class__
  • __dict__     格式:实例.__dict__
  • __doc__     格式:类名.__doc__
  • __bases__  格式:类名.__bases__
  • __mro__     格式:子类名.__mro__
 

 

class father():    def __init__(self):        self.name = "wang"        self.__age = 20    def A(self):        print("this is father\'s method")class mother():    def __init__(self):        self.sex = "man"    def A(self):        print("this is mother\'s method")class son(father,mother):    def A(self):        super().A()a = son()print (a.__class__)#查看类名print (a.__dict__)#查看全部属性,返回属性和属性值键值对形式print (son.__doc__)#查看对象文档print (son.__bases__)#查看父类print (son.__mro__)
{'name': 'wang', '_father__age': 20}None(
,
)(
,
,
,
)

 

转载于:https://www.cnblogs.com/longwhite/p/10397716.html

你可能感兴趣的文章
由&引发的转义问题
查看>>
亲爱的项目经理,我恨你
查看>>
金笛邮件系统组织机构管理
查看>>
HTML基础学习
查看>>
shell
查看>>
js中string对象的常用方法
查看>>
将jar文件转换成exe可执行文件
查看>>
linux下几个关机、重启的命令
查看>>
MySQL 的slave_exec_mode参数的用处
查看>>
《近距离探索memcache缓存》学习笔记
查看>>
解决SSH会话连接超时问题
查看>>
一条命令搞垮MongoDB实例
查看>>
netbackup基础知识
查看>>
个人信息保护大势所趋 勿待重创之下方出细典
查看>>
MJRefresh的运用
查看>>
mysql的一个坑
查看>>
java 帮助类
查看>>
Ubuntu使用Evernote
查看>>
Windows Server 2003 R2(x64)迁移到Windows Server 2008 R2
查看>>
美啦是如何抓住“她经济”一“美”而起
查看>>