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
  • 相关阅读:
    Oracle 表空间使用率
    sqlserver 查询主外键索引常用语句
    sqlserver查版本信息
    sqlserver事务日志已满原因分析
    sqlserver创建dblink链接Oracle
    Oracle的DBMS_METADATA.GET_DDL()函数
    Mysql 基于GTID的主从复制(实操)
    Mysql 基于日志点的主从复制(实操)
    修改Linux命令提示符
    MYSQL 二进制安装
  • 原文地址:https://www.cnblogs.com/imoing/p/3787673.html
Copyright © 2011-2022 走看看