python类的继承、多继承及其常用魔术方法
2024-08-31 14:02:39
继承
一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法。属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就是顶级基类object,它就相当于一个人的祖宗。当一个类没有写继承谁时,默认就是继承object。
class father(object):
def __init__(self):
self.name = "wang"
self.__age = 20
def A(self):
print(self.__age)
class son(father):
pass
a = son()
print(a.name)
a.A()
wang
20
上面代码中,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):
pass
a = 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
[<class '__main__.son'>, <class '__main__.father'>, <class '__main__.mother'>, <class 'object'>]
(<class '__main__.son'>, <class '__main__.father'>, <class '__main__.mother'>, <class 'object'>)
魔术方法
类的魔术方法有很多,所谓的魔术方法就是不需要自己调用,就可以自己再特定的时刻被自动调用,魔术方法的形式时__name__()。最常见的魔术方法就是初始化和析构了,下面介绍几种另外的魔术方法。
运算方法:运算方法可以实现类之间的运算,方便类之间的操作。
- __add__(self,other) #x + y
- __sub__(self,other)#x - y
- __mul__(self,other)#x * y
- __mod__(self,other)#x % y
- __iadd__(self,other)# x += y
- __isub__(self,other)# x -= y
- __radd__(self,other)#y + x
- __rsub__(self,other)#y - x
- __imul__(self,other)#x *= y
- __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.number
class B():
def __init__(self):
self.number = 30
a = 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__)
<class '__main__.son'>
{'name': 'wang', '_father__age': 20}
None
(<class '__main__.father'>, <class '__main__.mother'>)
(<class '__main__.son'>, <class '__main__.father'>, <class '__main__.mother'>, <class 'object'>)
最新文章
- ASP.NET开源CMS
- msql,触发器无事物回滚,插入之前满足条件再插入
- ACM 16进制的简单运算
- win8win10以管理员身份运行cmd方法
- [原创]java WEB学习笔记65:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) ModelDriven拦截器 paramter 拦截器
- Android开发优化
- (转)Combobox出现System.Data.DataRowView的原因,以及指定ValueMember的时机问题
- python正则实例
- Android用户界面 UI组件--TextView及其子类(二) Button,selector选择器,sharp属性
- CentOS7.1 使用资源搜集
- 关于css3的背景切割(background-clip)、背景原点(background-origin)的使用
- 开源 免费 java CMS - FreeCMS1.9 职位管理
- 关于在Editplus中设置内容提示比如syso的快捷输出的方法
- 为什么需要Docker?
- 几个NAND/NOR门可以表示一个XOR门?
- Android EditText手机号格式化输入XXX-XXXX-XXXX
- django项目的新建相关的命令及配置
- 面试3——java集合类面试题总结
- Dede文章标题长度修改
- JoyOI1935 导弹防御塔