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__类似。

  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/timlinux/p/9175543.html
Copyright © 2011-2022 走看看