一.组合补充
1.类或对象是否能做字典的key
(示例)
class Foo: pass user_info = { Foo:1, Foo():1 } print(user_info)
2.对象中到底有什么
(示例)
class Foo(object): def __init__(self,name): self.name = name def display(self): print(self.name) data_list = [Foo(8),Foo(9)] for item in data_list: print(item.name,item.display())
(示例)
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') # 创建了一个列表,列表中有三个对象(实例) # [ StarkConfig对象(num=1), StarkConfig对象(num=2), RoleConfig对象(num=3) ] config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)] for item in config_obj_list: print(item.num)
(示例)
class StarkConfig(object): def __init__(self,num): self.num = num def changelist(self,request): print(self.num,request) class RoleConfig(StarkConfig): pass # 创建了一个列表,列表中有三个对象(实例) # [ 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)
(示例)
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)
(示例)
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() 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)
示例
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(
总结:对象中的封装,self理解 理解性给出答案
二.主动调用其他类的成员
方式一(代码示例):
class Base(object): # # def f1(self): # print('5个功能') # # class Foo(object): # # def f1(self): # print('3个功能') # Base.f1(self) # # obj = Foo() # obj.f1()
class Base(object): def f1(self): print('5个功能') class Foo(Base): def f1(self): super().f1() print('3个功能') obj = Foo() obj.f1()
(按照类的继承顺序,找下一个.)
三特殊成员
class Foo(object): def __init__(self,a1,a2): # self.a1 = a1 self.a2 = a2 def __call__(self, *args, **kwargs): # print(11111,args,kwargs) return 123 def __getitem__(self, item): # print(item) return 8 def __setitem__(self, key, value): # print(key,value,111111111) def __delitem__(self, key): # print(key) def __add__(self, other): # return self.a1 + other.a2 def __enter__(self): # print('1111') return 999 def __exit__(self, exc_type, exc_val, exc_tb): # print('22222')
类名() 自动执行__init__
obj = Foo(1,2)
对象() 自动执行__call__
ret = obj(2,4,3,k1=123)
对象['xx'] 自动执行__getitem__
ret = obj['ya']
print(ret)
对象['xx'] = 11 自动执行 __setitem__
obj['k1'] = 123
del 对象[xx] 自动执行 __delitem__
del obj['uuu']
对象+对象 自动执行 __add__
obj1 = Foo(1,2)
obj2 = Foo(88,99)
ret = obj2 + obj1
print(ret)
with 对象 自动执行 __enter__ / __exit__
obj = Foo(1,2)
with obj as f:
print(f)
print('内部代码')
真正的构造方法
# 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)