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