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

      

  • 相关阅读:
    android.os.NetworkOnMainThreadException的解决方案
    一些LinuxC的小知识点(一)
    一些LinuxC的小知识点(二)
    <assert.h>库学习
    <string.h>的学习
    Java异常的中断和恢复
    Java Collection或Map的同步
    Java经典实例:按字符颠倒字符串
    Java 经典实例: Unicode字符和String之间的转换
    Java经典实例:处理单个字符串
  • 原文地址:https://www.cnblogs.com/a438842265/p/15002957.html
Copyright © 2011-2022 走看看