python中super()方法的解释

在学习 Python 类的时候,会碰见类中有 __init__() 这样一个函数,其实它就是 Python 的构造方法。

构造方法类似于类似 init() 这种初始化方法,来初始化新创建对象的状态,在一个对象创建后会立即调用,比如像实例化一个类:

f = FooBar()
f.init()#手动初始化

使用构造方法就能让它简化成如下形式:对象创建后自动调用魔法方法__init__(),对对象进行初始化操作

f = FooBar()

在明白了构造方法之后,来点进阶的问题,那就是父类的构造方法中的初始值无法继承的问题

class Bird:
    def __init__(self):
          self.hungry = True
    def eat(self):
          if self.hungry:
               print ‘Ahahahah‘
          else:
               print ‘No thanks!‘

class SongBird(Bird):
     def __init__(self):
          self.sound = ‘Squawk‘
     def sing(self):
          print self.song()

sb = SongBird()
sb.sing()    # 能正常输出
sb.eat()     # 报错,因为 songgird 中没有 hungry 特性

解决这个问题的办法有两种:

1、调用未绑定的超类构造方法(不推荐)

class SongBird(Bird):
     def __init__(self):
          Bird.__init__(self) #
          self.sound = ‘Squawk‘
     def sing(self):
          print self.song()

原理在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。

2、使用super函数(推荐)

class SongBird(Bird):
     def __init__(self):
          super(SongBird,self).__init__()
          self.sound = ‘Squawk‘
     def sing(self):
          print self.song()

原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。

super() 函数是用于调用父类(超类)的一个方法。

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重

复调用(钻石继承)等种种问题。

MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。(菜鸟文档)

原文地址:https://www.cnblogs.com/hemengjita/p/12584056.html

时间: 2024-07-28 22:37:47

python中super()方法的解释的相关文章

Python中__init__方法

注意1.__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了. 1 2 3 4 5 class A(object):     def __init__(self,name):         self.name=name     def getName(self):         return 'A '+self.name 当我们执行 1 a=A('hello') 时,可以理解为 1 2 a=object.__new__(A) A.__init__(a,'hello')

python中super().__init__和类名.__init__的区别

super().__init__相对于类名.__init__,在单继承上用法基本无差 但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次 多继承时,使用super方法,对父类的传参数,应该是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错 单继承时,使用super方法,则不能全部传递,只能传父类方法所需的参数,否则会报错 多继承时,相对于使用类名.__init__方法,要把每个父类全部写一遍, 而使用super方法

python中super出现的TypeError: must be type, not classobj 原因及解决

执行一下代码,出现错误,TypeError: must be type, not classobj class A():    def __init__(self):        print("Enter A")        print("Leave A") class B(A):    def __init__(self):        print("Enter B")        super(B, self).__init__()  

Python中strip方法的妙用

[开胃小菜] 当提到python中strip方法,想必凡接触过python的同行都知道它主要用来切除空格.有以下两种方法来实现. 方法一:用内置函数 #<python> if __name__ == '__main__': str = ' Hello world ' print '[%s]' %str.strip() #</python> 方法二:调用string模块中方法 #<python> import string if __name__ == '__main__

python 中特殊方法简写方式

##python 中特殊方法简写方式 class Test: __call__ = lambda *args: args[1] * 2 #这里需要注意lambda的参数 会默认将实例self 加进去 __str__ = lambda self: 'that`s useful...%s' % self.__class__.__name__ t = Test() print(t) print(t(10)) 原文地址:https://www.cnblogs.com/alplf123/p/1029388

Python 中Super的使用(二)

1.如何使用super 一开始照着示例代码去用super的时候,觉得这个东西很简单,就像其他的单继承机制的语言中的super一样好用,好理解.可是,当你试着混合诸如bound super  object,与unbound super object,metaclass,proxy object,descriptor,MRO,multiple inheritance 这样的概念一起来理解的时候,脑子就会变大,感觉这个东西后面的机制好复杂,一时半会真的很难弄清楚. 看了别人写的一些东西之后,尤其是是看

Python中sorted()方法的用法

1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对iterable的解释是:iteralbe指的是能够一次返回它的一个成员的对象.iterable主要包括3类: 第一类是所有的序列类型,比如list(列表).str(字符串).tuple(元组). 第二类是一些非序列类型,比如dict(字典).file(文件). 第三类是你定义的任何包含__iter__()或__getitem__()方法的类的对象. 2.Python帮助文档中对sorted方法的讲解: sorted(i

python中super关键字的用法

class A: def __init__(self):    print "enter A"    print "leave A" class B(A): def __init__(self):    print "enter B"    A.__init__(self)   # old method    print "leave B" >>> b = B() enter B enter A leave

Python中super()的使用(一)

1.super被引入的初衷 super()通常是被说成super函数,其实它是一个内置的类,是在Python2.2中新增加的,super()实例化一个super对象,这个super对象充当一个访问代理的角色,它帮助子类的对象访问父类,祖父类以及所有祖先类中被方法(尤其是访问那些被子类重写的方法). 在super类没有出现以前,如果要在子类方法中去调用父类的方法,必须显式的使用父类的类名,用一种非绑定的方式去调用.如下例子(所有例子程序均在Python3.4下实现)所示: class A(): d