美文网首页
Python 元类

Python 元类

作者: noteby | 来源:发表于2020-07-16 10:38 被阅读0次
  1. 什么是元类?
    元类就是创建类的类,type是最原始的一个元类。(实例是实例化的类,而类是元类的实例)
    python中一切皆为对象,所有的类都直接和间接的是type类的实例对象。
    另外,我们知道object是所有类的父类,同时object又是type类的实例对象。

  2. 元类中的特殊方法

__new__(cls,name,base,attr)
    元类中, __new__ 是用来生成类的,只会调用一次

__init__(self, name, *args, **kwargs)
    该元类的实例(也就是普通类)创建后被调用,用于为初始化实例的,只会调用一次
    
__call__(self, *args, **kwargs)
    元类创建的实例(也就是普通类),构造普通类的对象时调用,每次都会执行
  1. 元类如何创建类
在元类中是通过 __new__ 函数生成类的, 该函数是静态函数。

1. type(类名称[str], 父类[()],类的属性/函数[dict])

# 创建临时类
2. type.__new__(元类[type], 类名称[str], 父类[()],类的属性/函数[dict])
  1. 如何自定义元类?
# python3
class XXType(type): # 自定义元类必须要显式继承type类
    pass
    
class XXClass(metaclass=XXType): # 设置类的元类
    pass
 
# python2
# 设定 __metaclass__
  1. 在单例模式中的应用
import threading

# 创建类时,type的init方法自动执行,类() 执行type的call方法(这个方法中会依次执行类的new、init方法
class SingletonType(type):
    _instance_lock = threading.Lock()

    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            with SingletonType._instance_lock:
                if not hasattr(cls, "_instance"):
                    cls._instance = super(SingletonType, cls).__call__(*args, **kwargs)
        return cls._instance

class Foo(metaclass=SingletonType):
    def __init__(self):
        print(1)

# 创建对象时,类的init方法自动执行,对象() 执行类的call方法
obj = Foo()

相关文章

  • Python 进阶丨如何创建你的第一个 Python 元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类。 Python元类设置类...

  • 10.元类

    元类的对象是类type是python的内建元类 自定义元类:

  • 29.Python之面向对象的元类

    Python之面向对象的元类 什么是元类?类的类就是元类,元类创建对象。使用class定义的类,用来产生程序员自己...

  • Python 元类

    什么是元类?元类就是创建类的类,type是最原始的一个元类。(实例是实例化的类,而类是元类的实例)python中一...

  • scala类与伴生类、单例

    类似python元类与apply方法类似python中call方法

  • python 元类

    转载 刘仲雨 两句话掌握python最难知识点——元类 千万不要被所谓“元类是99%的python程序员不会用到的...

  • python元类

    在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立类也是对象。但是,P...

  • Python元类

    类也是对象,在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得...

  • Python元类

    1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:...

  • Python元类

    类也是对象 在Python中一切都是对象,类也不例外。所以可以对类进行以下操作。1.可以当做参数传递2.可以添加属...

网友评论

      本文标题:Python 元类

      本文链接:https://www.haomeiwen.com/subject/dgtphktx.html