class Bird:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print 'Ahaaaaa...'
self.hungry = False
else:
print 'No, thanks!'
class SomeBird(Bird):
def __init__(self):
self.song = 'Squawk'
def sing(self):
print self.song
sb = SomeBird()
sb.sing()
sb.eat()
函数程序运行结果:
Squawk
Traceback (most recent call last):
File "class.py", line 19, in <module>
sb.eat()
File "class.py", line 5, in eat
if self.hungry:
AttributeError: SomeBird instance has no attribute 'hungry'
在上面的函数中先定义了一个Brid
类,该类中调用构造方法对hungry进行初始化。而后又定义它的子类SomeBird
,该子类又调用构造方法进行初始化,这样会导致该构造方法进行重写,也就是说重写后只有song属性,没有hungry属性
如何在子类调用构造方法时,同时保留父类的属性呢
class Bird:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print 'Ahaaaaa...'
self.hungry = False
else:
print 'No, thanks!'
class SomeBird(Bird):
def __init__(self):
Bird.__init__(self)
self.song = 'Squawk'
def sing(self):
print self.song
sb = SomeBird()
sb.sing()
sb.eat()
程序运行结果:
Squawk
Ahaaaaa...
可以看到子类也拥有了父类的属性。
而在一般情况下,调用一个实例的方法时,该方法的参数会被自动绑定到实例上。
而上面的方法是一种“未绑定(unbound)”的方法,也就是说调用类的方法进行初始化,可以自由的提供需要的self参数。
参考《Python基础教程 p140-142》