特殊成员,主动调用其他类的成员
一.组合的补充
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 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
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
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
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
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
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
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
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
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
二.主动调用其他类的成员
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 print(obj(1,2,3,a=1)) ## 111 (1, 2, 3) {'a': 1} 123
1 ret=obj['shy'] #shy
2 print(ret) #8
1 ret=obj[11]=11 #11 11
2 print(ret) #返回值与key和value没有关系
1 del obj['uuu'] #uuu 没有返回值
1 obj1=Foo(1,2)
2 obj2=Foo(88,99)
3 ret=obj1+obj2
4 print(ret) #100
1 obj=Foo(1,2)
2 with obj as f:
3 print(f)
4 print('中间代码')
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)
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
改变世界,改变自己!