通过元类控制类的调用过程
#__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)