模板:控制对象的产生
class Mymeta(type):
def __call__(self, *args, **kwargs):
obj=object.__new__(self)
obj.__init__(*args, **kwargs)
return obj
class Person(metaclass=Mymeta):
def __init__(self,name):
self.name=name
def __call__(self, *args, **kwargs):
print('xxx')
p=Person('lqz')
#type只传一个参数有什么用?
#打印对象的类型
# print(type(1))
#class 底层原理,通过type类来实例化得到类
# def __init__(self,name):
# self.name=name
# Person=type('Person',(object,),{'x':1,'__init__':__init__})
# p=Person('lqz')
# print(Person.__dict__)
# print(p.__dict__)
# print(p.x)
#等同于
# class Person(object):
# x=1
# def __init__(self, name):
# self.name = name
# p=Person('lqz')
# print(Person.__dict__)
# print(p.__dict__)
# print(p.x)
#exec 执行字符串的代码,当成python解释器
# ss='''
# x=1
# print(x)
# '''
# g={}
# l={}
# exec(ss,g,l)
# print(l)
#自定义元类:继承type
# class Mymeta(type):
# def __init__(self,name,bases,dic):
# #self 是Person 这个类(对象)
# #在这个位置,其实self也就说Person这个类,内部已经有东西了,名称空间已经有东西了
# #所以在这个地方,可以通过dic来判断名称空间
# #也可以直接通过self.__dict__/self.属性 来判断
# a=dic.get('name')
# if not a :
# raise Exception('没有name属性,不能创建')
# # def __call__(self, *args, **kwargs):
# # pass
#
# class Person(metaclass=Mymeta): #Person=Mymeta('Person',(object,),{...}) Mymeta类实例化,会把三个参数传到Mymeta的__init__方法中
# # class Person(): #Person=Mymeta('Person',(object,),{...}) Mymeta类实例化,会把三个参数传到Mymeta的__init__方法中
# def __init__(self,name):
# self.name=name
# raise Exception('就不让你创建')
#
#
# p=Person('lqz') #自动触发Person类__init__的执行
#总结:可以通过自定义元类,重写__init__方法来控制类的产生