• 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
  • 相关阅读:
    机器学习:SVM(核函数、高斯核函数RBF)
    机器学习:SVM(非线性数据分类:SVM中使用多项式特征和核函数SVC)
    LeetCode566. Reshape the Matrix
    LeetCode 128. Longest Consecutive Sequence
    # 线程安全 & 线程安全函数 & 线程不安全函数
    Linux进程状态
    C++ 4种强制类型转换
    TCP超时重传、滑动窗口、拥塞控制、快重传和快恢复
    LeetCode 69. Sqrt(x)
    LeetCode543. Diameter of Binary Tree
  • 原文地址:https://www.cnblogs.com/imoing/p/3787673.html
Copyright © 2020-2023  润新知