继承
一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法。属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就是顶级基类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__()。最常见的魔术方法就是初始化和析构了,下面介绍几种另外的魔术方法。
运算方法:运算方法可以实现类之间的运算,方便类之间的操作。
- __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.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( , )( , , , )