super
super定义
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
super语法
#接收两个参数 super(class,self).xxx # XXX 父类的方法或属性 Python3.x: super().xxx # XXX 父类的方法或属性 Python2.x : super(Class, self).xxx :
实例
一般用法
python3.x
class A: def add(self, x): y = x+1 print(y) class B(A): def add(self, x): super().add(x) b = B() b.add(2) # 3
python2.x
class A(object): # Python2.x 记得继承 object def add(self, x): y = x+1 print(y) class B(A): def add(self, x): super(B, self).add(x) b = B() b.add(2) # 3
指定类方法后的用法
1.1
class A(object): def __init__(self): self.a = "OK" print(self.a) #OK print(self.__name__) #B class B(A): a = 123 #----类属性 def __init__(self,a): self.a = a #------对象属性 print(self.__class__) @classmethod #-----指定为类方法 def aaa(cls): print(cls.a) super(B, cls).__init__(cls) # A.__init__必须接受一个self参数 aa = B(123) #<class '__main__.B'> aa.aaa() # 123 #OK #B
1.2
class A(object): def foo1(self): #对象方法 print( "Hello",self) @staticmethod #静态方法 def foo2(): print( "hello") @classmethod #类方法 def foo3(cls): print ("hello",cls) a = A() # a.foo1() 与 A.foo1(a) 结果相同,不同的表示而已。 a.foo1() #最常见的调用方式,但与下面的方式相同 A.foo1(a) #这里传入实例a,相当于普通方法的self A.foo2() #这里,由于静态方法没有参数,故可以不传东西 A.foo3() #这里,由于是类方法,因此,它的第一个参数为类本身。 print(A) #可以看到,直接输入A,与上面那种调用返回同样的信息。