对组和的补充和主动调用其他类的成员以及特殊成员
一.关于上篇博客的总结:
1.成员(类):
(3).变量:
类变量(静态字段) 格式:类.字段/对象.字段
示例变量(字段) 格式:对象.字段
(2).方法:
实例方法 格式:对象.方法名
静态方法 格式:类.方法名/对象.方法名
类方法 格式:类.方法名/对象.方法名
(1).属性:
普通属性 格式:对象.属性名
2.修饰符:
公/私
3.组和(嵌套)

class Venue: def __init__(self, address): self.address = address bj = Venue('北京鸟巢') sh = Venue('上海体育馆 ') sz = Venue('深圳体育馆') class Schedule(object): def __init__(self, name, period, price, venue=None): self.name = name self.period = period self.price = price self.venue = venue bs1 = Schedule('LPL季前赛', 7, 100, bj) ss2 = Schedule('LPL季中赛', 7, 200, sh) zs3 = Schedule('LPL总决赛', 7, 400, sz) bs4 = Schedule('LPL总决赛', 7, 400, bj) ss5 = Schedule('LPL季后赛', 7, 300, sh) bs6 = Schedule('LPL表演赛', 7, 250, bj) class Battle(object): def __init__(self,name,start_time,end_time,people,introduction,schedule = None): self.name = name self.start_time = start_time self.end_time = end_time self.people = people self.introduction = introduction self.schedule = schedule br1 = Battle('RNG VS IG','2018','2019',70,'鼓掌',bs1) br2 = Battle('OMG VS RNG','2018','2019',70,'鼓掌',bs1) br3 = Battle('OMG VS SKT','2018','2019',70,'鼓掌',ss2) br4 = Battle('RNG VS SKT','2018','2019',70,'鼓掌',bs6) print(br1.schedule.venue.address)
二.组和的补充
1.类或对象能否做字典的key

class Foo: pass user_info = { Foo:1, Foo():5 } print(user_info)
2.确保对象中到底有什么

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()) 结果: 8 8 None 9 9 None
3.习题开始了:

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) 结果: 1 2 3
4.一大波习题即将到来:

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
5.来了,它们来了

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
6.坚持到了现在,不错嘛

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() 结果: 2 999 666 3
7.马上就要结束了

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 结果: 0 2 5
8.真的要结束了

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) 结果: 3 19 5 20 5 666 33
9.我说的是真的

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() 结果: 3 19 999 20 999 666 33
10.没想到吧,还有一个

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() 结果: 2 UserInfo 999 Department 999
11.总结一波:
一定要确定对象中封装了什么
一定要确定self到底是哪个sb
三.主动调用其他类的成员

# 方式一 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 f1(self): super().f1() print('3个功能') class Bar(object): def f1(self): print('6个功能') class Info(Foo,Bar): pass # obj = Foo() # 报错,因为super无法找到Foo继承了谁 # obj.f1() obj = Info() obj.f1()
四.特殊成员:
1.__init__
构造方法,通过类创建时,自动触发执行.

# __init__ class Foo: def __init__(self,a1,a2): self.a1 = a1 self.a2 = a2 obj = Foo(1,2)
2.__call__
对象后面加括号,触发执行
注:构造方法的执行是由创建对象触发的,即:对象 = 类名();而对于__call__方法的执行
是由对象后加括号触发的,即:对象()或者类()()

# __call__ class Foo: def __call__(self, *args, **kwargs): print(1,2,3,args,kwargs) return 123 obj = Foo() ret = obj(0,9,8,a1 = 76) print(ret) Foo()(0,9,8,a1 = 76) # 不常用 结果: 1 2 3 (0, 9, 8) {'a1': 76} 123 1 2 3 (0, 9, 8) {'a1': 76}
3.__getitem__,__setitem__,__delitem__
用于索引操作,如字典;以上分别表示获取,设置,删除数据

# __getitem__ class Foo: def __getitem__(self, item): print(item) return "哈哈" obj = Foo() ret = obj['嘿嘿'] print(ret) 结果: 嘿嘿 哈哈

# __setitem__ class Foo: def __setitem__(self, key, value): print(key,value,1111) obj = Foo() obj['k1'] = 123 结果: k1 123 1111

# __delitem__ class Foo: def __delitem__(self, key): print(key) obj = Foo() del obj['hhh'] 结果: hhh
4.__add__
对象+对象

# __add__ class Foo: def __init__(self,a1,a2): self.a1 = a1 self.a2 = a2 def __add__(self, other): return self.a1 + other.a1 obj = Foo(1,1) obj2 = Foo(99,88) ret = obj2 + obj print(ret) 结果: 100
5.with对象
自动执行__enter__/__exit__

# with对象 自动执行__enter__/__exit__ class Foo: def __init__(self,a1,a2): self.a1 = a1 self.a2 = a2 def __enter__(self): print('111') return 999 def __exit__(self, exc_type, exc_val, exc_tb): print('222') obj = Foo(1,2) with obj as f: print(f) print('内部代码') 结果: 111 999 内部代码 222
6.来个组和拳

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('内部代码') 结果: 11111 (6, 4, 2) {'k1': 456} yu 8 k1 123 111111111 uuu 90 1111 999 内部代码 22222
7.真正的构造方法:__new__

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)