zoukankan      html  css  js  c++  java
  • 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__
    """
    

      

  • 相关阅读:
    Scala学习笔记——断言和单元测试
    Spark学习笔记——读写Hbase
    Spark学习笔记——读写HDFS
    Scala学习笔记——简化代码、柯里化、继承、特质
    Spark学习笔记——读写MySQL
    Hbase学习笔记——基本CRUD操作
    Spark学习笔记——在集群上运行Spark
    IDEA启动Tomcat服务器时某些端口(如1099端口)被占用的解决办法
    ResultMap和ResultType在使用中的区别、MyBatis中Mapper的返回值类型
    java中的stream的Map收集器操作
  • 原文地址:https://www.cnblogs.com/a438842265/p/15002957.html
Copyright © 2011-2022 走看看