python3 继承完成包装,授权操作

1.包装:python为大家提供了标准数据类型,以及丰富的内置方法,

其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,进行加工,而其他的保持不变,以此达到我们想要的效果。

那继承/派生就可以实现这一功能。

举例:

 1 #继承的方式
 2 class List(list):
 3     def append(self, v):
 4         if type(v) is int:
 5             super().append(v)#super调用父类的append方法
 6         else:
 7             print("》》》》》》请输入一个整形数字")
 8 l1=List("asdxbhd")
 9 print(l1,type(l1))
10 l2=list('qwydwdiifhsio')
11 print(l2,type(l2))
12 l1.append(123456)
13 l1.append("小猪猪")
14 print(l1)
15 
16 
17 #############
18 ['a', 's', 'd', 'x', 'b', 'h', 'd'] <class '__main__.List'>
19 ['q', 'w', 'y', 'd', 'w', 'd', 'i', 'i', 'f', 'h', 's', 'i', 'o'] <class 'list'>
20 》》》》》》请输入一个整形数字
21 ['a', 's', 'd', 'x', 'b', 'h', 'd', 123456]
View Code

 2.授权:

实现授权是包装的一个特性。授权的过程,其实也就是所有的更新功能都交给新类的自定义的某部分功能来处理,但已存在的功能就授权给对象的默认属性。

实现授权的关键点是覆盖__getattr__()方法,在代码中包含一个对getattr()内建函数的调用,调用getattr()得到默认对象的属性,并返回它以便访问或者调用。

举例:

 1 #组合,授权
 2 class Cpu():
 3     def __init__(self,cpuprice,cpubrand):
 4         self.cpuprice=cpuprice
 5         self.cpubrand=cpubrand
 6     def cpuFunc(self):
 7         print("我是CPU,我主要是解释计算机指令以及处理计算机软件中的数据。")
 8 
 9 class Mainboard():
10     def __init__(self,mainboard_price,mainboard_brand,mainboard_size):
11         self.mainboard_price=mainboard_price
12         self.mainboard_brand=mainboard_brand
13         self.mainboard_size=mainboard_size
14     def mainBordFunc(self):
15         print("我是主板,我是构成复杂电子系统例如电子计算机的中心或者主电路板。")
16 
17 class Computer():
18     def __init__(self,comprice,combrand,cpuprice,cpubrand,mainboard_price,mainboard_brand,mainboard_size):
19         self.comprice=comprice
20         self.combrand=combrand
21         self.cpu=Cpu(cpuprice,cpubrand)###组合
22         self.mainboard=Mainboard(mainboard_price,mainboard_brand,mainboard_size)###组合
23     def play(self):
24         print("哈哈哈,我是一个电脑,你离不开我")
25 
26     def  __getattr__(self, item):
27         # return getattr(self.mainboard,item)
28         return getattr(self.cpu,item)
29 
30 c=Computer(9999,"华硕",899,"联想",799,"戴尔",699)
31 # c.mainBordFunc()
32 c.cpuFunc()
33 
34 
35 #################
36 我是CPU,我主要是解释计算机指令以及处理计算机软件中的数据。
View Code

 分析哈过程:

c.cpuFunc()方法的调用方式。首先,它会从c的属性字典去查找cpuFunc属性,发现该实例属性中不存在,

然后去Computer类的属性字典去查找cpuFunc属性,发现也不存在,就触发了__getattr__()方法,

__getattr__()一运行,就会调用getattr(self.cpu,"cpuFunc")方法的运行,得到一个内存地址传给了c.cpuFunc,然后运行。











posted @ 2018-09-23 23:44  小猪猪猪  阅读(258)  评论(0)    收藏  举报