python元类
在python中基于类可以创建对象
# 定义类 class Foo(object): def __init__(self.name): self.name = name def __new__(cls,*args,**kwargs): data = object.__new__(cls) return data # 根据类创建对象,分两步 # 1. 在内部执行new方法,创建一个空对象 {} # 2. 之后执行类的init方法,初始化对象。{"name":"xiao"} # 注意“:new方法称为构造方法,init方法称为初始化方法 obj = Foo("xiao")
对像-----------基于类实现的
类 ------------基于啥实现的????
类 默认是有type创建的 def do(self): pass # 1.创建类 # 类名。 继承谁 成员 Fun = type("Foo", (object,), {"v1": 123, "func": lambda self: 666, "do": do}) # 2.根据类创建对象 obj = Fun() # 3.调用对象中v1变量(类变量) print(obj.v1) # 4.执行对象的func方法 result = obj.func() print(result)
元类
# 肯定由type创建 class Foo(object): pass # 指定创建类的方法 # 首先先创建一个类,这个类继承type # metaclass指定类 class Myclass(type): pass class Fun(object,metaclass=Myclass): pass # Fun类由Myclass创建
例子
class Myclass(type): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def __new__(cls, *args, **kwargs): new_class = super().__new__(cls, *args, **kwargs) return new_class def __call__(self, *args, **kwargs): # 1. 调用自己那个类的 __new__ 方法去创建对象 empty_object = self.__new__(self) # 2. 调用自己那个类的 __init__ 方法初始化 self.__init__(empty_object, *args, **kwargs) return empty_object class Fun(object, metaclass=Myclass): def __init__(self, name): self.name = name # 执行的过程也是先走new在走init v1 = Fun("xiaoqiang") print(v1.name) """ 类加()是执行 __new__ 和 __init__ 对象加 ()[现在这段代码是Fun(),代码至上而下,走到class Fun处,创建Fun类,在往下遇见Fun()走Myclass的__call__的方法(也就是说Fun类是Mycls)] 是走的__call__ 的方法 在走__call__的方法时 先走的是__new__,在走__init__ """