许昌市做网站,网站的建设的含义,wordpress手机验证码登录,域名备案信息查询系统1 python通过继承、组合、委托组织类
#概念描述1继承属性查找X.name2多态方法调用X.method#xff0c;取决于X的类型3封装方法和运算符实现行为
通常来说#xff0c;独特的运算使用独特的方法名称#xff0c;不要依赖于调用标记。
python组织类结构的方式包括#xff1a…1 python通过继承、组合、委托组织类
#概念描述1继承属性查找X.name2多态方法调用X.method取决于X的类型3封装方法和运算符实现行为
通常来说独特的运算使用独特的方法名称不要依赖于调用标记。
python组织类结构的方式包括继承、组合、委托。
1.1 继承是一个关系
python的继承通过点号运算触发比如X.name在实例、类、超类中搜索属性。
#概念描述1超类、基类、父类被继承的类2派生类、子类继承的类3派生父类向子类看4继承子类项父类看
子类继承父类子类和父类为“是一个(is-a)”关系子类是父类的一种子类是一个更具体更全面的父类。
比如员工是父类清洁和扫地机器人工是子类扫地机器人是清洁工清洁工是一个员工。
示例
class Staff:#员工def __init__(self,name,salary0):self.namenameself.salarysalarydef payRaise(self,percent):self.salaryself.salary*(1percent)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__:srb1SweepRobot(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:namerobot1,salary2000
robot1 cleaning the lobby
Staff:namerobot1,salary2200.0Staff does stuff
Cleaner cleaning the office
Waiter Receiving customers
SweepRobot cleaning the lobby1.2 组合有一个关系
python的组合类通过内嵌其他类的对象来实现自己的接口。
组合类有一个或多个内嵌类(组件类)的对象作为自己的属性。
组合类和内嵌类为“有一个(has a)”关系。
比如酒店类(Hotel)有前台服务员(Waiter)和保洁员(Cleaner)两个类对象作为属性实现酒店的退房操作。
from staffs import Waiter,Cleanerclass Customer:def __init__(self,name,roomNo):self.namenameself.roomNoroomNodef 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.cleaner1Cleaner(保洁员1号)def checkOut(self,name,roomNo):#退房流程cust1Customer(name,roomNo)cust1.checkOut(self.waiter1)cust1.backCard(self.waiter1)self.cleaner1.work()if __name__ __main__:hot1Hotel()hot1.checkOut(顾客1号,168)
E:\documents\F盘python hotel.py
顾客1号 退房房号为 168
顾客1号 归还房卡给 前台1号
保洁员1号 cleaning guest rooms1.3 继承组合例子
Processor内嵌reader和writer实例对象为组合类并且定义子类继承必须实现的方法converter为转换器。
streams.py
from abc import ABCMeta,abstractmethod
class Processor:def __init__(self,reader,writer):#组合类self.readerreader#读取器实例self.writerwriter#写入器实例def process(self):while 1:dataself.reader.readline()if not data:breakdataself.converter(data)self.writer.write(data)abstractmethoddef converter(self,data):#继承子类实现转换器passconverters.py
from streams import Processorclass 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 sysprint(查看 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
---------------
UPTYXT.WORK/UP
UPBBS.TYXT.WORK/UP1.4 委托包装对象
用法
在__init__(self,obj)方法中传入被委托对象(obj)并且赋值给包装类的属性。
在__getattr__(self,attrname)方法拦截被委托对象的点号运算返回属性。
示例
class MyWrapper:def __init__(self,obj):#传入被委托对象赋值给包装类的属性self.wrappedobjdef __getattr__(self,attrname):#拦截点号运算print(trace:,attrname)#返回被委托对象属性return getattr(self.wrapped,attrname)
if __name__ __main__:mwLMyWrapper([1,2,3])mwL.append(梯阅线条)print(mwL.wrapped)
E:\documents\F盘python trace.py
trace: append
[1, 2, 3, 梯阅线条]