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__
"""

 

  

 

posted @ 2021-07-12 17:28  流年中渲染了微笑  阅读(22)  评论(0编辑  收藏  举报