组合(嵌套)练习:
class Foo: pass user_info = { Foo:1, Foo():5 } print(user_info) 结果: {<class '__main__.Foo'>: 1, <__main__.Foo object at 0x037EDD50>: 5}
class Foo(object): def __init__(self,age): self.age = age def display(self): print(self.age) data_list = [Foo(8),Foo(9)] #将对象存在列表中 for item in data_list: #遍历列表中的元素(即每个对象) print(item.age,item.display()) #先执行方法再打印 #先输出display方法的结果再打印item.age和item.display(),display方法返回没有返回值,则为None 结果: 8 8 None 9 9 None
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: #打印每个对象的.num print(item.num) 结果: 1 2 3
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) 结果: 1 168 2 168 3 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)] #取列表索引为1的元素,并执行run方法 config_obj_list[1].run() #取列表索引为2的元素,并执行run方法 config_obj_list[2].run() # 666 3 结果: 2 999 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 #字典为空,有0个键值对 site.register('range',666) #将'range'作为key,666作为value添加到字典 site.register('shilei',438) #将'shilei'作为key,438作为value添加到字典 print(len(site._registry)) # 2 #此时字典中有以上添加的两个键值对 site.register('lyd',StarkConfig(19)) #将'lyd'作为key,StarkConfig(19)这个对象作为value添加到字典中 site.register('yjl',StarkConfig(20)) #将'yjl'作为key,StarkConfig(20)这个对象作为value添加到字典中 site.register('fgz',RoleConfig(33)) #将'fgz'作为key,RoleConfig(33)这个对象作为value添加到字典中 print(len(site._registry)) # 5 #此时字典中有5个键值对 结果: 0 2 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)) #将'lyd'作为key,StarkConfig(19)这个对象作为value添加到字典中 site.register('yjl',StarkConfig(20)) #将'yjl'作为key,StarkConfig(20)这个对象作为value添加到字典中 site.register('fgz',RoleConfig(33)) #将'fgz'作为key,RoleConfig(33)这个对象作为value添加到字典中 print(len(site._registry)) # 3 #此时字典中有3个键值对 for k,row in site._registry.items(): #遍历字典,得到字典的key和value row.changelist(5) #调用value的changelist方法 结果: 3 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)) #将'lyd'作为字典的key,StarkConfig(19)这个对象作为字典的value,添加到字典中 site.register('yjl',StarkConfig(20)) #将'yjl'作为字典的key,StarkConfig(20)这个对象作为字典的value,添加到字典中 site.register('fgz',RoleConfig(33)) #将'fgz'作为字典的key,RoleConfig(33)这个对象作为字典的value,添加到字典中 print(len(site._registry)) # 3 #此时字典中有3个键值对 for k,row in site._registry.items(): #遍历字典,得到字典的key和value row.run() #通过字典的value执行run方法,子类中没有run方法,继承父类的run方法后执行自己的changelist 结果: 3 19 999 20 999 666 33
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) #将UserInfo类作为key,StarkConfig类作为value添加到字典中 site.register(Department,StarkConfig) #将Department类作为key,StarkConfig类作为value天机道字典中 print(len(site._registry)) # 2 #此时字典中有2个键值对 for k,row in site._registry.items(): #遍历字典,得到字典的key和value row.run() #通过字典的value执行run方法 ***此时的value是类,不是对象 结果: 2 <class '__main__.UserInfo'> 999 <class '__main__.Department'> 999
总结:
始终确定self是谁,搞清楚对象中封装的是什么
主动调用其他类的成员
class Base(object): def f1(self): print('5个功能') class Foo(object): def f1(self): print('3个功能') Base.f1(self) #可以在类中用类名.方法名(self)调用其他类的方法 ***self自己写 obj = Foo() obj.f1() 结果: 3个功能 5个功能
class Foo(object): def f1(self): super().f1() #按照继承顺序找下一个(即先执行Bar中的f1,再执行Foo中的f1) print('3个功能') class Bar(object): def f1(self): print('6个功能') class Info(Foo, Bar): pass obj = Info() obj.f1() 结果: 6个功能 3个功能 class Base(object): def f1(self): print('5个功能') class Foo(Base): def f1(self): super().f1() #按照继承关系找下一个(即先执行Base中的f1,再执行自己的f1) print('3个功能') obj = Foo() obj.f1() 结果: 5个功能 3个功能
特殊成员
1.类名(),自动执行__init__
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') #1. 类名() 自动执行__init__ obj = Foo(1, 2) #2. 对象() 自动执行__call__ ret = obj(6, 4, 2, k1=456) #3. 对象['xx'] 自动执行 __getitem__ ret = obj['yu'] print(ret) #4. 对象['xx'] = 11 自动执行 __setitem__ obj['k1'] = 123 #5. del 对象[xx] 自动执行__delitem__ del obj['uuu'] #6. 对象+对象 自动执行__add__ obj1 = Foo(1, 2) obj2 = Foo(88, 99) ret = obj2 + obj1 print(ret) #7. with 对象 自动执行__enter__/__exit__ obj = Foo(1, 2) with obj as f: print(f) print('内部代码') #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)