python子类定制父类及多态调用介绍

电子说

1.3w人已加入

描述

python通过子类继承超类来定制子类的行为。

1.1 重写类方法

(1)如果子类和超类有同名方法,根据搜索树规则,优先调用子类方法。

(2)子类重写超类方法:在子类定义和父类已有的同名的方法。

(3)一般是对父类方法的加强,即存在父类方法的处理逻辑。

1.2 父类名.方法名

用法

class SupClass:
   def methodA(self):pass
   
class SubClass(SupClass):
   def methodA(self):
       SupClass.methodA(self)
       pass

描述

在子类,通过“父类名.方法名”调用父类同名方法,达到简化代码的效果。

SupClass.methodA(self):

(1)通过“类名.方法名”调用方法时,需要送一个实例给方法。

(2)self为当前调用方法的实例,故需显式将self送给父类方法。

1.3 多态

python子类如果重写超类的方法,那么根据搜索树规则:

超类实例对象,会调用超类的同名方法;

子类实例对象,会调用子类的同名方法;

即,会根据当前调用实例,自动调用对应的方法。

条件:

(1) 继承:多态发生在子类和超类之间

(2) 重写:子类重写父类方法。

1.4 示例

class Tool:
   def payraise(self,p,*args):
       p.payraise(*args)
       
class MyPerson:
   def __init__(self,name,job = None,pay = 0):
       self.name = name
       self.job = job
       self.pay = pay
   def payraise(self,rate):
       self.pay = int(self.pay * (1 + rate))
   def __str__(self):
       return 'MyPerson:name={0.name},job={0.job},pay={0.pay}'.format(self)

class MyManager(MyPerson):# 继承
   # 重写
   def payraise(self,rate,bonus=0.1):
       MyPerson.payraise(self,rate+bonus)
       
if __name__ == '__main__':
   mp1 = MyPerson('mp1')
   mp2 = MyPerson('mp2','c++开发',20000)
   mm1 = MyManager('mm1','开发经理',50000)
   
   print(mp1)
   print(mp2)
   print(mm1)
   
   mp2.payraise(0.1)
   mm1.payraise(0.1)
   print(mp2)
   print(mm1)  
   
   print('#'*10+'多态'+'#'*10)
   for p in (mp1,mp2,mm1):
       p.payraise(0.1)
       print(p)
       
   t = Tool()
   
   print('#'*10+'多态'+'#'*10)
   for p in (mp1,mp2,mm1):
       t.payraise(p,0.1)
       print(p)
# 打开cmd,执行下面示例
E:\\documents\\F盘>python myperson.py
MyPerson:name=mp1,job=None,pay=0
MyPerson:name=mp2,job=c++开发,pay=20000
MyPerson:name=mm1,job=开发经理,pay=50000
MyPerson:name=mp2,job=c++开发,pay=22000
MyPerson:name=mm1,job=开发经理,pay=60000
##########多态##########
MyPerson:name=mp1,job=None,pay=0
MyPerson:name=mp2,job=c++开发,pay=24200
MyPerson:name=mm1,job=开发经理,pay=72000
##########多态##########
MyPerson:name=mp1,job=None,pay=0
MyPerson:name=mp2,job=c++开发,pay=26620
MyPerson:name=mm1,job=开发经理,pay=86400
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分