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
  • 相关阅读:
    git merge merge错误 —— 纠正
    copy —— docker cp & kubectl cp
    docker —— 获取 仓库中的 tag 列表
    课程——《深度学习的优化方法》
    基础知识篇(干货,次次都有新体悟)——十大经典排序算法2
    基础知识篇(干货,次次都有新体悟)——数据结构
    criteo 接口升级——MAPI deprecated
    CAP
    Redis 数据类型
    十大经典排序算法(转发)
  • 原文地址:https://www.cnblogs.com/imoing/p/3787673.html
Copyright © 2011-2022 走看看