构造方法
构造方法的名字是__init__
,它会在对象创建后立即被调用:
class Foobar:
"a stupid example"
def __init__(self):
self.a = 101
我们可以看到成员变量a
自动被初始化:
In [21]: a = Foobar()
In [22]: a.a
Out[22]: 101
重写方法
class A:
def hello(self):
print "Hello, I am class A"
def greeting(self):
print "Hola!"
class B(A):
def greeting(self):
print "Soy abel. Y tu?"
在这里类B
继承了类A
,但是在类B
中,重写了类A
中的方法greeting
:
In [24]: a = A()
In [25]: b = B()
In [26]: a.hello()
Hello, I am class A
In [27]: a.greeting()
Hola!
In [28]: b.hello()
Hello, I am class A
In [29]: b.greeting()
Soy abel. Y tu?
但是对于子类的构造方法就不那么简单了,子类如果想要使用父类中的成员,必须要在构造方法中调用父类的构造方法。有两种方法,在「旧式类」中这样实现:
class Bird:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print "I am hungry!"
self.hungry = not self.hungry
else:
print "No, thanks!"
class Songbird(Bird):
def __init__(self):
Bird.__init__(self)
self.sound = "Squawk!"
def sing(self):
print self.sound
在子类的构造函数中调用了父类的构造函数,调用方法是Bird.__init__(self)
,这里采用的方法是「未绑定方法」。因为程序直接用类名来调用方法,这时没有实例会被绑定。我们把当前实例作为self
参数提供给未绑定方法,这样我们就可以正确地初始化子类对象。和「未绑定方法」对应的是「绑定方法」,当调用一个实例的方法时,该方法的self
参数会自动绑定到这个实例上,这成为「绑定方法」。
在「新式类」中重写构造函数的方法是使用super
函数:
class Songbird(Bird):
def __init__(self):
# Bird.__init__(self)
super(Songbird, self).__init__()
self.sound = "Squawk!"
super
函数的两个参数分别是当前的类和当前对象self
,它返回一个super
对象,这个对象负责进行方法解析。当对它进行访问时,它会查找所有的超类(以及超类的超类),这里调用的是超类的__init__
方法。