嵌套,主动调用其他类成员和特殊成员

组合(嵌套)练习:

class Foo:
    pass

user_info = {
    Foo:1,
    Foo():5
}

print(user_info)
结果:
{<class '__main__.Foo'>: 1, <__main__.Foo object at 0x037EDD50>: 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())      #先执行方法再打印
                                        #先输出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
将对象作为字典的value
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
将对象作为字典的value,并调用对象方法
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
将对象作为字典的value,并调用对象的方法,子类继承父类
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
将参数为类的对象作为字典的value,并调用对象的方法

  总结:

    始终确定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)
View Code

 

posted @ 2018-08-29 20:57  Virous1887  阅读(180)  评论(0编辑  收藏  举报