Python 基础之魔法方法

构造方法 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值