特殊成員,主動調用其餘類的成員

一.組合的補充

1 class Foo: 2     def __init__(self): 3         pass
4 user_info={ 5     Foo:1, 6     Foo():2
7 } 8 print(user_info)  #{<class '__main__.Foo'>: 1, <__main__.Foo object at 0x0000012DDE6D8BE0>: 2}
1.類和對象是否能作字典的key
 1     def __init__(self,age):  2         self.age=age  3     def display(self):  4         print(self.age)  5 data_list=[Foo(8),Foo(9)]  6 for item in data_list:  7     print(item.age,item.display())  8 # 8
 9 # 8 None
10 # 9
11 # 9 None
2.對象中到底有什麼
 1 class StarkConfig():  2 
 3     def __init__(self,num):  4         self.num=num  5 
 6     def changelist(self,request):  7         print(self.num,request)  8 
 9 class RoleConfig(StarkConfig): 10 
11     def changelist(self,request): 12         print(666) 13 
14 config_obj_list=[StarkConfig(1),StarkConfig(2),RoleConfig(3)] 15 
16 for item in config_obj_list: 17     print(item.num) 18 # 1,2,3
3.練習題
 1 class StarkConfig():  2 
 3     def __init__(self,num):  4         self.num=num  5 
 6     def changelist(self,request):  7         print(self.num,request)  8 
 9 class RoleConfig(StarkConfig): 10 
11     def changelist(self,request): 12         print(666) 13 
14 config_obj_list=[StarkConfig(1),StarkConfig(2),RoleConfig(3)] 15 
16 for item in config_obj_list: 17     item.changelist(168) 18 # 1 168
19 # 2 168
20 # 666
4.練習題
 1 class StarkConfig():  2 
 3     def __init__(self,num):  4         self.num=num  5 
 6     def changelist(self,request):  7         print(self.num,request)  8 
 9 class RoleConfig(StarkConfig): 10 
11     def changelist(self,request): 12         print(666,self.num) 13 
14 config_obj_list=[StarkConfig(1),StarkConfig(2),RoleConfig(3)] 15 
16 for item in config_obj_list: 17     item.changelist(168) 18 # 1 168
19 # 2 168
20 # 666 3
5.練習題
 1 class StarkConfig():  2 
 3     def __init__(self,num):  4         self.num=num  5 
 6     def changelist(self,request):  7         print(self.num,request)  8 
 9     def run(self): 10         self.changelist(999) 11 
12 class RoleConfig(StarkConfig): 13 
14     def changelist(self,request): 15         print(666,self.num) 16 
17 config_obj_list=[StarkConfig(1),StarkConfig(2),RoleConfig(3)] 18 
19 config_obj_list[1].run() #2 999
20 config_obj_list[2].run()  #666 3
6.練習題
 1 class StarkConfig():  2 
 3     def __init__(self,num):  4         self.num=num  5 
 6     def changelist(self,request):  7         print(self.num,request)  8 
 9     def run(self): 10         self.changelist(999) 11 
12 class RoleConfig(StarkConfig): 13 
14     def changelist(self,request): 15         print(666,self.num) 16 
17 class AdminSite: 18     def __init__(self): 19         self._registry={} 20 
21     def register(self,k,v): 22         self._registry[k]=v 23 
24 site=AdminSite() 25 print(len(site._registry))  #0
26 site.register('range',666) 27 site.register('shili',438) 28 print(len(site._registry))  #2
29 
30 site.register('lyd',StarkConfig(19)) 31 site.register('yjl',StarkConfig(20)) 32 site.register('fgz',RoleConfig(33)) 33 
34 print(len(site._registry)) # 5
7.練習題
 1 class StarkConfig():  2 
 3     def __init__(self,num):  4         self.num=num  5 
 6     def changelist(self,request):  7         print(self.num,request)  8 
 9     def run(self): 10         self.changelist(999) 11 
12 class RoleConfig(StarkConfig): 13 
14     def changelist(self,request): 15         print(666,self.num) 16 
17 class AdminSite: 18     def __init__(self): 19         self._registry={} 20 
21     def register(self,k,v): 22         self._registry[k]=v 23 
24 site=AdminSite() 25 
26 site.register('lyd',StarkConfig(19)) 27 site.register('yjl',StarkConfig(20)) 28 site.register('fgz',RoleConfig(33)) 29 
30 print(len(site._registry)) # 3
31 
32 for k,row in site._registry.items(): 33     row.changelist(5) 34 
35 # 19 5
36 # 20 5
37 # 666 33
8.練習題
 1 class StarkConfig():  2 
 3     def __init__(self,num):  4         self.num=num  5 
 6     def changelist(self,request):  7         print(self.num,request)  8 
 9     def run(self): 10         self.changelist(999) 11 
12 class RoleConfig(StarkConfig): 13 
14     def changelist(self,request): 15         print(666,self.num) 16 
17 class AdminSite: 18     def __init__(self): 19         self._registry={} 20 
21     def register(self,k,v): 22         self._registry[k]=v 23 
24 site=AdminSite() 25 
26 site.register('lyd',StarkConfig(19)) 27 site.register('yjl',StarkConfig(20)) 28 site.register('fgz',RoleConfig(33)) 29 
30 print(len(site._registry)) # 3
31 
32 for k,row in site._registry.items(): 33  row.run() 34 
35 # 19 999
36 # 20 999
37 # 666 33
9.練習題
 1 class UserInfo:  2     pass
 3 class Department:  4     pass
 5 
 6 class StarkConfig():  7 
 8     def __init__(self,num):  9         self.num=num 10 
11     def changelist(self,request): 12         print(self.num,request) 13 
14     def run(self): 15         self.changelist(999) 16 
17 class RoleConfig(StarkConfig): 18 
19     def changelist(self,request): 20         print(666,self.num) 21 
22 class AdminSite: 23     def __init__(self): 24         self._registry={} 25 
26     def register(self,k,v): 27         self._registry[k]=v(k) 28 
29 site=AdminSite() 30 
31 site.register(UserInfo,StarkConfig) 32 site.register(Department,StarkConfig) 33 
34 print(len(site._registry)) # 3
35 
36 for k,row in site._registry.items(): 37  row.run() 38 
39 # <class '__main__.UserInfo'> 999
40 # <class '__main__.Department'> 999
10.練習題

二.主動調用其餘類的成員

 1 class Base:  2     def func(self):  3         print(666)  4 
 5 方案一:  6 obj=Base()  7 obj.func()  8 
 9 方案二: 10 obj=Base() 11 Base.func(obj)
 1 class Base:  2     def f1(self):  3         print('五個功能')  4 
 5 class Foo(Base):  6     def f1(self):  7         print('三個功能')  8         Base.f1(self)  #類名.函數名(self/對象名)
 9 
10 obj=Foo() 11 obj.f1()
方法一:
 1 class Base:  2     def f1(self):  3         print('五個功能')  4 
 5 class Foo(Base):  6     def f1(self):  7         ret= super().f1()  #按照類的繼承順序,找下一個
 8         print(ret)  9         print('三個功能') 10 
11 obj=Foo() 12 obj.f1()
方法二:

三.特殊成員

 1 class Foo:  2     def __init__(self,a1,a2):  3         self.a1=a1  4         self.a2=a2  5         print(666)  6     def __call__(self,*args,**kwargs):  7         print(111,args,kwargs)  8         return 123
 9     def __getitem__(self, item): 10         print(item) 11         return 8
12     def __setitem__(self, key, value): 13         print(key, value) 14         return 123
15     def __delitem__(self, key): 16         print(key) 17     def __add__(self,other): 18         return self.a1+other.a2 19 
20     def __enter__(self): 21         print('先執行') 22         return 999  #能夠有返回值
23     def __exit__(self, exc_type, exc_val, exc_tb): 24         print('後執行') 25     def __new__(cls, *args, **kwargs): 26         pass
1 obj=Foo(1,2)  #666
1.類名() 自動執行__init__
1 print(obj(1,2,3,a=1))   ## 111 (1, 2, 3) {'a': 1} 123
2.對象() 自動執行__call__
1 ret=obj['shy']   #shy
2 print(ret)   #8
3.對象[] 自動執行__getitem__
1 ret=obj[11]=11  #11 11
2 print(ret)   #返回值與key和value沒有關係
4.對象['xx']=xx 自動執行__setitem__
1 del obj['uuu']   #uuu 沒有返回值
5.del 對象[xx] 自動執行__delitem__
1 obj1=Foo(1,2) 2 obj2=Foo(88,99) 3 ret=obj1+obj2 4 print(ret)  #100
6.對象+對象 自動執行 __add__ 對象之間的相加(加減乘除絕對值等等所有都有)
1 obj=Foo(1,2) 2 with obj as f: 3     print(f) 4     print('中間代碼')
7.with 對象: 自動執行 __enter__,__exit__
 1 class Foo(object):  2     def __init__(self,a1,a2):  3         '''
 4  爲對象進行數據的初始化  5  :param a1:  6  :param a2:  7         '''
 8         print(1)  9         self.a1=a1 10         self.a2=a2 11         print(666) 12     def __new__(cls, *args, **kwargs): 13         print(2) 14         return object.__new__(cls)  #python內部建立一個空的對象 沒有return就不能執行__init__
15 obj=Foo(1,2)
8.真正的構造方法
 1 class Foo(object):  2     def __init__(self,a1,a2):  3         '''
 4  爲對象進行數據的初始化  5  :param a1:  6  :param a2:  7         '''
 8         print(1)  9         self.a1=a1 10         self.a2=a2 11         print(666) 12     def __new__(cls, *args, **kwargs): 13         print(2) 14         v1= object.__new__(cls)  #python內部建立一個空的對象 沒有return就不能執行__init__
15         print(v1)  #<__main__.Foo object at 0x0000023912498D30>
16         return v1 17 obj=Foo(1,2) 18 print(obj)  #<__main__.Foo object at 0x0000023912498D30>
19 v1和obj的內存地址是同樣的,但內部的數據是不同的,v1是空的,obj中含有數據
構造方法的補充
全部的類都繼承object
相關文章
相關標籤/搜索