通过元类控制类的调用过程

通过元类控制类的调用过程

#__call__
#控制类的调用过程,实际在控制:对象的产生
class Mymeta(type):
    def __call__(self, *args, **kwargs):
        # print('xxx')
        return 1
class Person(object,metaclass=Mymeta):
    school='oldboy'
    def __init__(self,name):
        self.name=name
    def score(self):
        print('分数是100')
p=Person('nick')
print(p.name)
class Person():
    school='oldboy'
    def __init__(self,name):
        self.name=name
    def score(self):
        print('分数是100')
    def __call__(self, *args, **kwargs):
        print('xxxx')

p=Person('nick')   #自动触发init的执行
#先触发元类的__call__
p()

__new__

练习:把对象中所有属性都设置成私有的

分析
# class Mymeta(type):
#     def __call__(self, *args, **kwargs):
#         #self 是Person这个类
#         # print(args)
#         # print(kwargs)
#         # return self(*args)  #这里不行,会递归
#         # self.__new__(self)
#         #实例化产生一个Person类的对象,借助__new__来产生,需要把类传过去,才能产生对象
#         #obj 是Person类的对象,只不过是空的
#         obj=object.__new__(self)
#         # obj=self.__new__(self)
#         #调用__init__方法完成初始化
#         #类来调用__init__方法,就是个普通函数,有几个参数就穿几个惨
#         # self.__init__(obj,*args, **kwargs)
#         #对象来调用__init__方法,对象的绑定方法,会把自身穿过来
#         obj.__init__(*args, **kwargs)
#         print(obj)
#         return obj
#
#
# class Person(object, metaclass=Mymeta):
#     school = 'oldboy'
#     def __init__(self, name):
#         self.name = name
#     def score(self):
#         print('分数是100')
# p = Person(name='nick')
# print(p)
# print(p.name)

#把对象所有的属性变成私有
class Mymeta(type):
    def __call__(self, *args, **kwargs):
        obj=object.__new__(self)
        obj.__init__(*args,**kwargs)
        obj.__dict__ = {'_%s__%s' % (self.__name__, k): v for k, v in obj.__dict__.items()}
        return obj

class Person(object,metaclass=Mymeta):
    school='oldboy'
    def __init__(self,name):
        self.name=name
    def score(self):
        print('分数是100')
p=Person(name='nick')
print(p.__dict__)
print(p.name)
原文地址:https://www.cnblogs.com/aden668/p/11453775.html