组合的补充
class StarkConfig(object): def __init__(self,num): self.num = num def changelist(self,request): print(self.num,request) class RoleConfig(StarkConfig): def changelist(self,request): print(666,self.num) # 创建了一个列表,列表中有三个对象(实例) # [ StarkConfig对象(num=1), StarkConfig对象(num=2), RoleConfig对象(num=3) ] config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)] for item in config_obj_list: item.changelist(168) 1,168 2,168, 666,3
class StarkConfig(object): def __init__(self,num): self.num = num def changelist(self,request): print(self.num,request) def run(self): self.changelist(999) class RoleConfig(StarkConfig): def changelist(self,request): print(666,self.num) config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)] config_obj_list[1].run() #2 999 config_obj_list[2].run() # 666 3
class StarkConfig(object): def __init__(self,num): self.num = num def changelist(self,request): print(self.num,request) def run(self): self.changelist(999) class RoleConfig(StarkConfig): def changelist(self,request): print(666,self.num) class AdminSite(object): def __init__(self): self._registry = {} def register(self,k,v): self._registry[k] = v site = AdminSite() print(len(site._registry)) # 0 site.register('range',666) site.register('shilei',438) print(len(site._registry)) # 2 site.register('lyd',StarkConfig(19)) site.register('yjl',StarkConfig(20)) site.register('fgz',RoleConfig(33)) print(len(site._registry)) # 5
class StarkConfig(object): def __init__(self,num): self.num = num def changelist(self,request): print(self.num,request) def run(self): self.changelist(999) class RoleConfig(StarkConfig): def changelist(self,request): print(666,self.num) class AdminSite(object): def __init__(self): self._registry = {} def register(self,k,v): self._registry[k] = v site = AdminSite() site.register('lyd',StarkConfig(19)) site.register('yjl',StarkConfig(20)) site.register('fgz',RoleConfig(33)) # print(len(site._registry)) # 3 for k,row in site._registry.items(): row.changelist(5)
19 5
20 5
666 33
class StarkConfig(object): def __init__(self,num): self.num = num def changelist(self,request): print(self.num,request) def run(self): self.changelist(999) class RoleConfig(StarkConfig): def changelist(self,request): print(666,self.num) class AdminSite(object): def __init__(self): self._registry = {} def register(self,k,v): self._registry[k] = v site = AdminSite() site.register('lyd',StarkConfig(19)) site.register('yjl',StarkConfig(20)) site.register('fgz',RoleConfig(33)) print(len(site._registry)) # 3 for k,row in site._registry.items(): row.run() class UserInfo(object): pass class Department(object): pass class StarkConfig(object): def __init__(self,num): self.num = num def changelist(self,request): print(self.num,request) def run(self): self.changelist(999) class RoleConfig(StarkConfig): def changelist(self,request): print(666,self.num) class AdminSite(object): def __init__(self): self._registry = {} def register(self,k,v): self._registry[k] = v(k) site = AdminSite() site.register(UserInfo,StarkConfig) site.register(Department,StarkConfig) # print(len(site._registry)) # 3 for k,row in site._registry.items(): row.run()
<class '__main__.UserInfo'> 999
<class '__main__.Department'> 999
主动调用其他类的成员
1.方法一
class foo(object): def f1(self): print("你好啊") class user(object): def f1(self): print("hello") foo.f1(self) obj=user() obj.f1() 调用结果: hello 你好啊 注意:主动调用的时候需要自己手动传self
2.方法二:按照类的继承顺序,找下一个
class foo(object): def f1(self): print("你好啊") class user(foo): def f1(self): print("hello") super().f1()#按照继承顺序找下一个 obj=user() obj.f1() hello 你好啊
特殊成员:
1.类名()自动执行__init__
obj=foo(1,2)
2.对象() 自动执行__call__
class fool(object): def __call__(self, *args, **kwargs): print(22,33,44,55) return 111 obj=fool ret=obj.__call__(1) print(ret) 22 33 44 55 111#返回值
3.对象["xx"]=11 自动执行__setitem__没有返回值
class foo(object): def __setitem__(self, key, value): print("hhh") obj=foo() obj.__setitem__(1,0) hhh
4.对象["xx"] 会自动执行__getitem__有返回值
class foo(object): def __getitem__(self, item): print("123") return "bbb" obj=foo() ret=obj.__getitem__(0) print(ret) 123 bbb
5.del 对象[xx] 自动执行__delitem__ 有返回值
class foo(object): def __delitem__(self, key): print(555) return 222 obj=foo() ret=obj.__delitem__("key") print(ret) 555 222
6.对象+对象 会自动执行__add__
class foo(object): def __add__(self, other): return self.a1+other.a2
7.with 对象 自动执行__enter__ /__exit__
def __exit__(self, exc_type, exc_val, exc_tb)
8.真正的构造方法
class Foo(object): def __init__(self, a1, a2): # 初始化方法 """ 为空对象进行数据初始化 :param a1: :param a2: """ self.a1 = a1 self.a2 = a2 def __new__(cls, *args, **kwargs): # 构造方法 """ 创建一个空对象 :param args: :param kwargs: :return: """ return object.__new__(cls) # Python内部创建一个当前类的对象(初创时内部是空的.). obj1 = Foo(1,2) print(obj1) obj2 = Foo(11,12) print(obj2)