组合(嵌套)的 补充,主动调用其他成员 以及特殊成员

组合的补充

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)
1,168   2,168, 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)

config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
config_obj_list[1].run()   #2 999
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)
19 5
20 5
666 33
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.run()
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()


<class '__main__.UserInfo'> 999
<class '__main__.Department'> 999

主动调用其他类的成员

1.方法一

class foo(object):
    def f1(self):
        print("你好啊")
class user(object):
    def f1(self):
        print("hello")
        foo.f1(self)
obj=user()
obj.f1()

调用结果:
hello
你好啊
注意:主动调用的时候需要自己手动传self

2.方法二:按照类的继承顺序,找下一个

class foo(object):
    def f1(self):
        print("你好啊")
class user(foo):
    def f1(self):
        print("hello")
        super().f1()#按照继承顺序找下一个
obj=user()
obj.f1()

hello
你好啊

 特殊成员:

1.类名()自动执行__init__

obj=foo(1,2)

2.对象() 自动执行__call__

class fool(object):
    def __call__(self, *args, **kwargs):
        print(22,33,44,55)
        return 111
obj=fool
ret=obj.__call__(1)
print(ret)


22 33 44 55
111#返回值

 3.对象["xx"]=11 自动执行__setitem__没有返回值

class foo(object):
    def __setitem__(self, key, value):
        print("hhh")
obj=foo()
obj.__setitem__(1,0)

hhh

 4.对象["xx"] 会自动执行__getitem__有返回值

class foo(object): 
    def __getitem__(self, item):
        print("123")
        return "bbb"
obj=foo()
ret=obj.__getitem__(0)
print(ret)

123
bbb

 5.del 对象[xx]   自动执行__delitem__     有返回值

class foo(object): 
    def __delitem__(self, key):
        print(555)
        return 222

obj=foo()
ret=obj.__delitem__("key")
print(ret)



555
222

6.对象+对象  会自动执行__add__

 class foo(object):
    def __add__(self, other):
        return self.a1+other.a2

7.with 对象 自动执行__enter__ /__exit__


def __exit__(self, exc_type, exc_val, exc_tb)

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)
原文地址:https://www.cnblogs.com/wqzn/p/9555533.html