zoukankan      html  css  js  c++  java
  • python初始化父类错误

    源码如下:

    #!/usr/bin/env python
    
    class Bird():
            def __init__(self):
                    self.hungry = True
    
            def eat(self):
                    if self.hungry:
                            print 'Aaaah...'
                            self.hungry = False
                    else:
                            print 'No, Thanks!'
    
    
    class SongBird(Bird):
            def __init__(self):
                    super(SongBird, self).__init__()
           #       Bird.__init__(self)
                    self.sound = 'Squawk!'
    
            def sing(self):
                    print self.sound

    错误信息如下:

    >>> from Bird import Bird, SongBird
    >>> b = Bird()
    >>> b.eat()
    Aaaah...
    >>> b.eat()
    No, Thanks!
    >>> sb = SongBird()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "Bird.py", line 17, in __init__
        super(SongBird, self).__init__()
    TypeError: must be type, not classobj


    错误原因:

    使用super初始化父类只对父类为新风格(new-style)的生效,对旧风格的不生效。

    解决方式1:

    #!/usr/bin/env python
    
    # 使用new-style
    class Bird(object):
            def __init__(self):
                    self.hungry = True
    
            def eat(self):
                    if self.hungry:
                            print 'Aaaah...'
                            self.hungry = False
                    else:
                            print 'No, Thanks!'
    
    
    class SongBird(Bird):
            def __init__(self):
                    super(SongBird, self).__init__()
                    self.sound = 'Squawk!'
    
            def sing(self):
                    print self.sound

    解决方法2:

    #!/usr/bin/env python
    
    __metaclass__ = type
    
    class Bird:
            def __init__(self):
                    self.hungry = True
    
            def eat(self):
                    if self.hungry:
                            print 'Aaaah...'
                            self.hungry = False
                    else:
                            print 'No, Thanks!'
    
    
    class SongBird(Bird):
            def __init__(self):
                    super(SongBird, self).__init__()
                    self.sound = 'Squawk!'
    
            def sing(self):
                    print self.sound

    解决方法3(使用old-style):

    #!/usr/bin/env python
    
    class Bird():
            def __init__(self):
                    self.hungry = True
    
            def eat(self):
                    if self.hungry:
                            print 'Aaaah...'
                            self.hungry = False
                    else:
                            print 'No, Thanks!'
    
    
    class SongBird(Bird):
            def __init__(self):
                    # 不使用super进行初始化
                    Bird.__init__(self)
                    self.sound = 'Squawk!'
    
            def sing(self):
                    print self.sound
  • 相关阅读:
    USB子系统gadget analyse
    关于嵌入式的学习和职业发展
    编译JNI动态库so
    Linux串口编程
    i2c_get_clientdata和to_i2c_client 的使用获取平台设备
    Kbuild 编译系统分析
    解决QPST 出现的 "服务器正在运行" 的 下载错误.
    Msm 高通平台配置记录之一
    USB Skeleton driver 分析记录
    网站应用数据库相关 过滤类
  • 原文地址:https://www.cnblogs.com/imoing/p/3787673.html
Copyright © 2011-2022 走看看