zoukankan      html  css  js  c++  java
  • python 面向对象之路 主动调用 特殊成员 补充组合 (3)

    一.组合补充

    1.类或对象是否能做字典的key

    (示例)

    class Foo:
        pass
    
    user_info = {
        Foo:1,
        Foo():1
    }
    print(user_info)

    2.对象中到底有什么

    (示例)

    class Foo(object):
    
        def __init__(self,name):
            self.name = name
    
        def display(self):
            print(self.name)
    
    data_list = [Foo(8),Foo(9)]
    
    for item in data_list:
        print(item.name,item.display())

    (示例)

    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)

    (示例)

    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)

    (示例)

    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)

    (示例)

    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() # 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
    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

    (示例)

    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)
     

    示例

    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(

    总结:对象中的封装,self理解   理解性给出答案 

    二.主动调用其他类的成员

    方式一(代码示例):

    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 __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')

    类名()  自动执行__init__

    obj = Foo(1,2)

    对象() 自动执行__call__

    ret = obj(2,4,3,k1=123)

    对象['xx'] 自动执行__getitem__

    ret = obj['ya']

    print(ret)

    对象['xx'] = 11 自动执行 __setitem__

    obj['k1'] = 123

    del 对象[xx] 自动执行 __delitem__

    del obj['uuu']

     对象+对象 自动执行 __add__

    obj1 = Foo(1,2)

    obj2 = Foo(88,99)

    ret = obj2 + obj1

    print(ret)

    with 对象 自动执行 __enter__ / __exit__

    obj = Foo(1,2)

    with obj as f:

    print(f)

    print('内部代码')

    真正的构造方法

    # 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)
  • 相关阅读:
    暑假周进度总结(一)
    第十七周进度总结
    大二下学期软件工程概论总结
    第十六周进度总结
    程序员修炼之道读书笔记(三)
    程序员修炼之道读书笔记(二)
    《程序员修炼之道》读书笔记(一)
    第十五周进度总结
    python之路--day6---文件处理
    python之路--day6--字符编码
  • 原文地址:https://www.cnblogs.com/SUIFAN/p/9562216.html
Copyright © 2011-2022 走看看