imoing

导航

统计
 

源码如下:

#!/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

 

posted on 2014-06-13 22:36 艾莫明 阅读(...) 评论(...) 编辑 收藏