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


    组合(嵌套)练习:

    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
  • 相关阅读:
    Angular项目中引入jQuery
    ERROR in Error: ***Module is not an NgModule
    angular-cli项目报Error encountered resolving symbol values statically. Function calls are not supported.错误的处理。
    在angular项目中使用bootstrap的tooltip插件时,报错Property 'tooltip' does no t exist on type 'JQuery<HTMLElement>的解决方法和过程
    微信小程序学习笔记(四)--框架-视图层
    js打印窗口内容并当窗口内容较长时自动分页
    微信小程序学习笔记(三)--框架-逻辑层
    微信小程序学习笔记(二)--框架-全局及页面配置
    微信小程序学习笔记(一)--创建微信小程序
    在ag-grid表格上实现类似Excel中的按下enter键自动跳转到下一行对应的输入框功能,Angular4开发
  • 原文地址:https://www.cnblogs.com/Virous1887/p/9555629.html
Copyright © 2020-2023  润新知