面向对象绝命十连杀

今天说的内容很沉重!!!  请自备氧气袋!!

  前方高能!! 发车~
一杀

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

  

恭喜你已通关

 期待升级版

 

posted @ 2018-08-29 16:02  RootEvils  阅读(282)  评论(0编辑  收藏  举报