zoukankan      html  css  js  c++  java
  • [TimLinux] Python 元类

    1. type函数

    name = "This is a string"
    print(type(name))  # <class 'str'>
    print("*" * 10, "分界线", "*" * 10)
    
    cls = type('Foo', (), {})
    f = cls()
    print(type(f))  # <class '__main__.Foo'>
    print(type(cls))  # <class 'type'>
    print(cls.__name__)  # Foo
    print("*" * 10, "分界线", "*" * 10)
    
    def init(self, name, age):
        self.name = name
        self.age = age
        print(self.name, self.age)
    
    cls = type('Foo', (object, ), {'__init__': init})
    f = cls('Tim', 22)  # Tim 22
    View Code

    2. __new__函数

    class Foo(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
            print(self.name, self.age)
    
        def tmp(self):
            print("call tmp()")
    
        def __new__(cls, *args, **kwargs):
            print("call __new__")
            obj = object.__new__(cls)
            print("id(obj)===", id(obj))
            return obj
    
    
    f1 = Foo('Tim', 22) # 这一个操作,等于===下面的两步操作。
    print("id(f1)===", id(f1))
    f1.tmp()
    
    #call __new__
    #id(obj)=== 1507711426120
    #Tim 22
    #id(f1)=== 1507711426120
    #call tmp()
    
    f2 = Foo.__new__(Foo)
    print("id(f2)===", id(f2))
    f2.__init__('Tim', 22)
    f2.tmp()
    
    #call __new__
    #id(obj)=== 1507711426232
    #id(f2)=== 1507711426232
    #Tim 22
    #call tmp()
    View Code

    3. __init__函数

    __init__函数,如果由Foo类能声明对象的时候,调用顺序是,先调用__new__,然后通过使用python提供的object.__new__方法,来创建一个对象,接下来把这个对象返回,然后由这个返回的对象,来调用__init__方法。

    Foo.__new__ --> 通过object.__new__生产对象 --> 使用这个对象调用Foo.__init__方法-->完成类的对象声明

    4. __metaclass__变量

    们允许我们在一条class语句的末尾,插入当创建一个类对象的时候自动运行的逻辑。这个逻辑不会把类名重新绑定到一个装饰器可调用对象,而是把类自身的创建指向特定的逻辑。换句话说,元类最终只是定义自动运行代码的另外一种方式。

    通过元类以及前面列出的其他工具, Python 为我们提供了在各种环境中插入逻辑的方法——在运算符计算时、属性访问时、函数调用时、类实例创建时,现在是在类对象创建时。

    和类装饰器不同,它通常是添加实例创建时运行的逻辑,元类在类创建时运行。同样的,它们都是通常用来管理或扩展类的钩子,而不是管理其实例。例如,元类可以用来自动为类的所有方法添加装饰,把所有使用的类注册到一个 API ,自动为类添加用户接口逻辑,在文本文件中从简单声明来创建或扩展类,等等。由于我们可以控制如何创建类(并且通过它们的实例获取的行为),它们的实用性潜在地很广泛。

    我的理解:元类,用于给类,自动添加一些东西,比如自动添加一些方法,把实例方法的名称统一加上前缀等等。

    元类是type类的子类,类是type类的对象,创建类的过程,就是创建一个特定的对象(类),那就存在调用该对象类的__new__,__init__方法,而对象需要能够带括号运行,这个是对象调用了创建该对象类的__call__方法,当这个对象换为类之后,类对象的初始化方式,根普通类对象调用__call__类似。

  • 相关阅读:
    自定义maven插件
    vim编辑器的基本用法
    sql查询两条记录的时间差
    spring boot继承web和mybatis时,调用接口删除记录出现的空指针以及解决办法
    Thymeleaf模板引擎的初步使用
    Spring Boot中的AutoConfiguation核心注解
    Spring Boot中的自定义start pom
    Spring中,使用Java配置的方式进行依赖注入
    设计模式之——flyweight模式
    ConfuserEx .net dll加壳失败原因
  • 原文地址:https://www.cnblogs.com/timlinux/p/9175543.html
Copyright © 2011-2022 走看看