前言:
今天咱们对“python派生”大致比较关切,姐妹们都想要学习一些“python派生”的相关内容。那么小编同时在网络上网罗了一些对于“python派生””的相关内容,希望咱们能喜欢,朋友们快快来学习一下吧!通常来说,独特的运算使用独特的方法名称,不要依赖于调用标记。
python组织类结构的方式包括:继承、组合、委托。
#
概念
描述
1
继承
属性查找X.name
2
多态
方法调用X.method,取决于X的类型
3
封装
方法和运算符实现行为
1.1 继承:是一个关系
python的继承通过点号运算触发,比如X.name,在实例、类、超类中搜索属性。
#
概念
描述
1
超类、基类、父类
被继承的类
2
派生类、子类
继承的类
3
派生
父类向子类看
4
继承
子类项父类看
子类继承父类,子类和父类为“是一个(is-a)”关系,子类是父类的一种,子类是一个更具体,更全面的父类。
比如:员工是父类,清洁和扫地机器人工是子类,扫地机器人是清洁工,清洁工是一个员工。
示例
class Staff:#员工 def __init__(self,name,salary=0): self.name=name self.salary=salary def payRaise(self,percent): self.salary=self.salary*(1+percent) def work(self):#干一些事情 print(self.name,'does stuff') def __repr__(self): return '<Staff:name={},salary={}>'.format(self.name,self.salary) class Cleaner(Staff):#保洁员 def __init__(self,name): Staff.__init__(self,name,3000) def work(self):#打扫客房 print(self.name,'cleaning guest rooms') class Waiter(Staff):#前台服务员 def __init__(self,name): Staff.__init__(self,name,5000) def work(self):#接待顾客 print(self.name,'Receiving customers') class SweepRobot(Cleaner):#扫地机器人 def __init__(self,name): Staff.__init__(self,name,2000) def work(self):#打扫大堂 print(self.name,'cleaning the lobby') if __name__=='__main__': srb1=SweepRobot('robot1') print(srb1) srb1.work() srb1.payRaise(0.1) print(srb1);print() for klass in Staff,Cleaner,Waiter,SweepRobot: obj = klass(klass.__name__) obj.work() '''E:\documents\F盘>python staffs.py <Staff:name=robot1,salary=2000> robot1 cleaning the lobby <Staff:name=robot1,salary=2200.0> Staff does stuff Cleaner cleaning the office Waiter Receiving customers SweepRobot cleaning the lobby '''1.2 组合:有一个关系
python的组合类通过内嵌其他类的对象来实现自己的接口。
组合类有一个或多个内嵌类(组件类)的对象作为自己的属性。
组合类和内嵌类为“有一个(has a)”关系。
比如,酒店类(Hotel)有前台服务员(Waiter)和保洁员(Cleaner)两个类对象作为属性,实现酒店的退房操作。
from staffs import Waiter,Cleaner class Customer: def __init__(self,name,roomNo): self.name=name self.roomNo=roomNo def checkOut(self,waiter):#退房 print(self.name,'退房,房号为',self.roomNo) def backCard(self,waiter):#归还房卡 print(self.name,'归还房卡给',waiter.name) class Hotel: def __init__(self): #Hotel有 Waiter 和 Cleaner 类的对象 self.waiter1 = Waiter('前台1号') self.cleaner1=Cleaner('保洁员1号') def checkOut(self,name,roomNo):#退房流程 cust1=Customer(name,roomNo) cust1.checkOut(self.waiter1) cust1.backCard(self.waiter1) self.cleaner1.work() if __name__ == '__main__': hot1=Hotel() hot1.checkOut('顾客1号','168') '''E:\documents\F盘>python hotel.py 顾客1号 退房,房号为 168 顾客1号 归还房卡给 前台1号 保洁员1号 cleaning guest rooms '''1.3 继承组合例子
Processor内嵌reader和writer实例对象,为组合类,并且定义子类继承必须实现的方法converter,为转换器。
streams.py
from abc import ABCMeta,abstractmethod class Processor: def __init__(self,reader,writer):#组合类 self.reader=reader#读取器实例 self.writer=writer#写入器实例 def process(self): while 1: data=self.reader.readline() if not data:break data=self.converter(data) self.writer.write(data) @abstractmethod def converter(self,data):#继承,子类实现转换器 pass
converters.py
from streams import Processor class Uppercase(Processor): def converter(self,data):#实现抽象超类的方法 return data.upper() class HTMLize: def write(self,line): print('<UP>{}</UP>'.format(line.rstrip())) if __name__ == '__main__': sep='---------------' import sys print('查看 tyxt.txt内容:\n{}'.format(open('tyxt.txt').read())) print(sep) Uppercase(open('tyxt.txt'),sys.stdout).process() print() print(sep) Uppercase(open('tyxt.txt'),open('tyxtup.txt','w')).process() print('查看 tyxtup.txt内容:\n{}'.format(open('tyxtup.txt').read())) print(sep) Uppercase(open('tyxt.txt'),HTMLize()).process() ''' E:\documents\F盘>python converters.py 查看 tyxt.txt内容: tyxt.work bbs.tyxt.work --------------- TYXT.WORK BBS.TYXT.WORK --------------- 查看 tyxtup.txt内容: TYXT.WORK BBS.TYXT.WORK --------------- <UP>TYXT.WORK</UP> <UP>BBS.TYXT.WORK</UP> '''1.4 委托:包装对象
用法
在init(self,obj)方法中传入被委托对象(obj),并且赋值给包装类的属性。
在getattr(self,attrname)方法,拦截被委托对象的点号运算,返回属性。
示例
class MyWrapper: def __init__(self,obj): #传入被委托对象,赋值给包装类的属性 self.wrapped=obj def __getattr__(self,attrname): #拦截点号运算 print('trace:',attrname) #返回被委托对象属性 return getattr(self.wrapped,attrname) if __name__ == '__main__': mwL=MyWrapper([1,2,3]) mwL.append('梯阅线条') print(mwL.wrapped) '''E:\documents\F盘>python trace.py trace: append [1, 2, 3, '梯阅线条'] '''2 END
本文首发微信公众号:梯阅线条,
更多内容参考python知识分享或软件测试开发目录。
标签: #python派生