Python的「魔法方法」——(未完成)

构造方法

构造方法的名字是__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__方法。

你可能感兴趣的:(Python的「魔法方法」——(未完成))