面向对象绝命十连杀
今天说的内容很沉重!!! 请自备氧气袋!!
前方高能!! 发车~
一杀
1. 类或对象是否能做字典的key??
首先想一下key是那些数据类型能够做的
class Foo:
pass
user_info = {
Foo:1,
Foo():5
}
print(user_info)
那么结果是什么呢??
{<class '__main__.Foo'>: 1, <__main__.Foo object at 0x0000017EE2D7E668>: 5}
看来类的对象是可以做字典的key的我们的猜测是没错的
小试牛刀
二杀
对象中到底有什么?? 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
那么这个None是怎么出现的呢?
因为在执行display的方法的时候没有返回值所以就返回了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') config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)] for item in config_obj_list: 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 config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)] for item in config_obj_list: item.changelist(168) 这个好像跟前面的差不多但是类的方法是不一样的而且有参数 开动大脑输出结果是?? 1 168 2 168 3 168 前俩个都好理解,那么第三个怎么理解呢?? 在Roleconfig这个类中没有changlist方法他就继承了基类的方法
五杀
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) config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)] for item in config_obj_list: item.changelist(168) 稍有变化考验你对于self到底理解的怎么样? 爆出你的答案: 1 168 2 168 666 3 在运行的时候一定不能乱self指的是谁,虽然自己没有要继承但是不要忘了自己的self属于谁?这样就不会迷糊了
六杀
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() 两个坑!!!首先索引的坑因该不会跳吧!要是你的结果是 1 999 2 999 那么恭喜你入了第一个索引的坑列表的1,2是索引不是位置 正确答案: 2 999 666 3 如果不是这个答案那么你就入了第二个坑那就是self是RoleConfig的不是继承的,自己有的时候一定要用自己的
七杀
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)) site.register('range',666) site.register('shilei',438) print(len(site._registry)) site.register('lyd',StarkConfig(19)) site.register('yjl',StarkConfig(20)) site.register('fgz',RoleConfig(33)) print(len(site._registry)) 注意是多少个打印 一共有三个 前面的两个根本就不用看的太多只有在registrer方法里面有所以直接数就可以了 所以结果是 0 2 5 零是为什么呢?? 因为前面没有传参数所以就是0
八杀
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 结果是这样的那么恭喜你做错了! 少一个print() 3 19 5 20 5 666 33 正确结果 还是注意self的继承关系 有自己的一定记住用自己的
九杀
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)) for k,row in site._registry.items(): row.run() 注意吸取前面的教训 正确结果是 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) site.register(Department,StarkConfig) print(len(site._registry)) for k,row in site._registry.items(): row.run()
一脸闷逼吧!对呀!不然怎么能叫大招呢?
先一步一步分析 首先 要往字典里传值,那么先看key,valur 是什么?
self._registry={userinfo:starkconfig(userinfo),Department:StarkConfig(Department)}
这一步一定要做出来然后一步一步带值
输出结果
2
<class '__main__.UserInfo'> 999
<class '__main__.Department'> 999
恭喜你已通关
期待升级版