构造方法 init()
构造方法类似于初始化方法,但是构造方法与其他普通的方法的不同之处在于,当一个对象被创建之后,会立即调用构造方法。
class Servant(object):
def init(self):
self.servant ="Saber"
fb=Servant()
fb.init()
print(fb.servant)
class Servant(object):
def __init__(self):
self.servant = "Saber"
fb = Servant()
print(fb.servant)
以上两段代码的功能是完全一样的。
重写一般方法和构造方法
每个类都可能有一个或者多个父类,子类可以从父类中继承行为方式。因此如果一个方法在子类a的一个实例中被调用,单是在子类中找不到这个方法,那么就会到他的父类里面去找这个方法。
class A(object):
def pp(self):
print("Hello world!")
class a(A):
pass
b = a()
B = A()
B.pp()
b.pp()
在有些时候我们需要重写父类的方法,那么对于一般方法和构造方法来说要如何来重写呢?
一般方法的重写
一般方法只需要在子类中重写或者添加就好了。
class A(object):
def say(self):
print("hello world!")
class a(A):
def say(self):
print("ni hao shi jie !")
B = A()
b = a()
B.say()
b.say()
构造方法的重写
构造方法用上述方法来写的话,就会遇到问题。如下:
class Bird(object):
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print("eatting")
self.hungry = False
else :
print("No,thanks!")
class SongBird(Bird):
def __init__(self):
self.sound = "Squawk"
def sing(self):
print(self.sound)
b = Bird()
b.eat()
b.eat()
sb = SongBird()
sb.sing()
sb.eat() #加上这一句就会产生异常。
产生异常的原因是在SongBird中,构造方法被重写,但是新的构造方法中没有任何关于初始化hungry特性的代码。为了达到预期的效果,SongBird的构造方法必须要调用其超类Birld的构造方法来确保进行基本的初始化。
解决方法有:
1.调用父类方法的未绑定版本。
2.使用super函数
调用父类方法的未绑定版本(不常用)
其实很简单
class SongBird(Bird):
def __init__(self):
Bird.__init__(self)
self.sound = "Squawk"
def sing(self):
print(self.sound)
在SongBird类中添加一行代码Bird.init(self)就可以了。
在调用一个实例的方法的时候,该方法的self参数会自动绑定到实例上(称之为绑定方法)。但是如果直接调用类的方法(比如Bird.init),那么就没有实例会被绑定。这样就可以自由的提供需要的self参数。这样的方法称为未绑定方法。
使用super函数(经常使用)
class SongBird(Bird):
def __init__(self):
super(SongBird,self).__init__()
self.sound = "Squawk"
def sing(self):
print(self.sound)