Python OOP Detail

data attribute


 

方法

 

调用超类构造函数


 

重写方法

 

interface

#Super 定义一个method函数以及在子类中期待一个动作的delegate
class Super:
    def method(self):
        print('in Super.method')    #Default behavior
    def delegate(self):
        self.action()               #Expected to be defined


#Inheritor 没有提供任何新的变量名,因此会获得Super中定义的一切内容
class Inheritor(Super):             #Inherit method verbatim
    pass


#Replacer 用自己的版本覆盖Super的method
class Replacer(Super):              #Replace method completely
    def method(self):
        print('in Replacer.method')


#Extender 覆盖并返回默认method,从而定制Super的method
class Extender(Super):              #Extend method behavior
    def method(self):
        print('starting Extender.method')
        Super.method(self)
        print('ending Extender.method')


#Provider 实现Super的delegate方法预期的action方法
class Provider(Super):              #Fill in a required method
    def action(self):
        print('in Provider.action')


if __name__ == '__main__':
    for instance in (Inheritor, Replacer, Extender):
        print('\n' + instance.__name__ + '...')
        instance().method()
    print('\nProvider...')
    x = Provider()
    x.delegate()

 测试结果:


 

抽象基类:assert、NotImplementedError



 

@abstractmethod

 

命名空间


 

Summary

抽象类是会调用方法的类,但没有继承或定义该方法,而是期待该方法由子类填补。当行为无法预测,非得等到更为具体的子类编写时才知道,通常可用这种方式把类通用化。OOP软件框架也使用这种方式作为客户端定义、可定制的运算的实现方法。

 

当简单赋值语句(x = y)出现在类语句的顶层时,就会把数据属性附加在这个类上(Class.x)。就像所有的类属性,这会由所有的实例共享。不过,数据属性并不是可调用的方法函数。

 

如果类定义自身的__init__构造函数,但是也必须启动超类的构建其代码,就必须手动调用超类的__init__方法。超类的构造函数式通过类名称来调用,手动传入self实例:Superclass.__init__(self, ...)

 

要增强继承的方法而不是完全替代,还得在子类中进行重新定义,但是要从子类的新版方法中,手动回调超类版本中的这个方法。也就是,把self实例手动传给超类版本的这个方法:Superclass.method(self,...)

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值