防止属性被意外覆盖 解决重复使用metaclass metaclass new init references 正文 关于Python2.x中metaclass这一黑科技,我原以为我是懂的,只有当被打脸的时候...而且在实际项目中也使用过metaclass,比如creating-a-singleton-in-python一文中提到的用metaclass创建单例,比如用metaclass实现mixin效果,当然,正是后面这个使用案列让我重新认识...metaclass。...就有metaclass是function的实例,也解释了为什么metaclass为一个类是更好的选择。...(methods, "metaclass"); 8 if (metaclass !
metaclass 译为元类,可以理解为 metaclass 为描述类的超类,同时可以改变子类的形态,本文介绍相关内容。...而metaclass 是控制类实例(这里表示类本身的定义,不是类的实例)产生的”超类“ 直接看一个 metaclass的例子可以有更直观的理解 metaclass 实例 class Mymeta(...如果存在__metaclass__,Python将会使用指定的__metaclass__来创建class Foo。...显式指定 metaclass 在创建类时显式指定 metaclass 类的内容 class Foo(metaclass=Mymeta): pass 该方法指定的metaclass会被子类继承...使用 metaclass 的风险 不过,凡事有利必有弊,尤其是 metaclass 这样“逆天”的存在。正如你所看到的那样,metaclass 会"扭曲变形"正常的 Python 类型模型。
先以一个大牛的一段关于Python Metapgramming的著名的话来做开头:
元类(MetaClass) MetaClass,直译过来就是元类,顾名思义,就是类的类,如果说class是object的模板,那么MetaClass就是class的模板(Java使用抽象类或者接口来做类的模板...In object-oriented programming, a metaclass is a class whose instances are classes....Just as an ordinary class defines the behavior of certain objects, a metaclass defines the behavior of...Metaclasses can be implemented by having classes be first-class citizen, in which case a metaclass is...https://en.wikipedia.org/wiki/Metaclass 元类的命名规则是 名字 + MetaClass #说明 python中双下划线加名字再加双下划线的变量名是预先定义的特殊类型
今天我们就来看看,metaclass 到底是阿拉丁神灯,还是潘多拉魔盒。 什么是 metaclass 很多书都会翻译成 元类,仅从字面理解, meta 的确是元,本源,翻译没毛病。...在没有 metaclass 的情况下,子类继承父类,父类是无法对子类执行操作的,但有了 metaclass,就可以对子类进行操作,就像装饰器那样可以动态定制和修改被装饰的类,metaclass 可以动态的定制或修改继承它的子类...metaclass 能解决什么问题? 你已经知道了 metaclass 可以像装饰器那样定制和修改继承它的子类,这里就说下它能解决什么实际问题。...现在你有 1 万个不同格式的 YAML 配置文件,本来你需要写 1 万个类来加载这些配置文件,有了 metaclass,你只需要实现一个 metaclass 超类,然后再实现一个子类继承这个 metaclass...metaclass 大展身手的机会。
原文地址:what is metaclass in Python?...metaclass属性 当我们创建类的时候,可以给它添加metaclass属性: class Foo(object): __metaclass__ = something... [...]...所以对于以下代码: class Foo(Bar): pass Python工作流程如下: 首先检查Foo中是否具有属性__metaclass__?...可以定义模块级别的__metaclass__来实现。 这样模块中所有的类都是通过这个元类来创建的。...) 你可能注意到参数upperattr_metaclass, 它代表要实例化的类。
type,作为metaclass,创建了以上所有的class object。 type是Python定义好的metaclass。当然,我们也可以自定义metaclass。...设置了__metaclass__的话,class的创建就会由指定的metaclass处理,那么我们只需要让这个metaclass将所有attribute的名字改成大写即可。...class作为metaclass可以继承其他的metaclass,重载母类的方法,甚至可以使用别的metaclass。...如果我们使用class作为metaclass,某一使用该metaclass的class的子类将仍是是其metaclass的实例。但这一功能无法通过使用函数作为metaclass实现。...使用metaclass可以使得代码结构更加优美。实际应用中我们很少使用metaclass来实现上面那样简单的功能。使用metaclass往往是为了实现非常复杂的操作。
先简单介绍下Python中的元类(metaclass)。元类就是创建类的类,对于元类来说,类是它的实例,isinstance(cls, metaclass)将返回True。...Python def with_metaclass(meta, *bases): """Compatible metaclass :param meta: the metaclass...<class '__main__.with_metaclass....__new__(metaclass, 'temp_class', (), {}),它创建了一个临时类,具有如下属性: 名称为temp_class 是函数内部类metaclass的实例,它的元类是metaclass...接下来,定义Bar时,Bar得到继承的元类metaclass,过程如下: 实例化metaclass 调用metaclass.
# metaclass就是用来创建类的类 """ 1、一切事物皆为对象,python的class(类)本身也是一个对象(实例),它是tpye的对象(实例) 2、所有的类都默认继承object 3、创建类的本质就是
在实际的代码中,我们一般还是不会直接动态生成类的,还是调用 class Foo 语法来生成类比较常见一点,这时候可以指定 metaclass 参数就好了。...可以通过 Foo(metaclass=MetaFoo) 这种方式来指定元类。...class Foo(metaclass=MetaFoo): pass 这种定义和上面的元类用法效果完全是一致的。...__new__(meta, name, bases, attrs) class Model(metaclass=MetaModel): pass 这样用户使用的时候就可以这样定义: >>>
什么是元类,请用代码解释如何使用元类 ''' metaclass: 元类,类似于创建类的模板,所有的类都是通过他来创建的,可以自由控制类的创建过程 单例模式、ORM模式 ''' class SingLeton...__instance class MyClass(metaclass=SingLeton): pass my1 = MyClass() my2 = MyClass() print(my1
之前学python的时候就看见过metaclass的文章,没看懂,那篇博客后面说到,metaclass是python的黑魔法99% 不会用到。于是果断放弃。...不过最近看flask-WTForm组建的源码,一开始就是metaclass。没办法,硬着头皮重新看metaclass。基本了解,现在总结如下: 一、metaclass干嘛的?...metaclass是指定类由谁创建。能够定制类的创建过程 指定类由谁创建的???开什么玩笑,类不是由'我'创建的吗???? python中一切皆对象,类也是对象,类是由type类创建。...python也给我们提供了自定义类的创建的方法,即metaclass。type也是类,它可以创建类,因此我们叫它元类,不要过分纠结这是什么鬼,知道type类可以创建类就行。...四、定制类生成的好处: 当然是非常多的,最容易理解的,单例模式便可以用 metaclass来实现。其他的好处,如ORM,我还说不上来,等弄清楚再补充。
答案就是 metaclass,metaclass 是 class 的 class,metaclass 创建 class,class 创建 object,metaclass→class→object:...MyClass = MetaClass() my_object = MyClass() a 是对象,对象的类型是 class,class 的类型是 metaclass >>> a = 1 # 对象 >...Python 3 中语法有变化: class Foo(object, metaclass=something): ... # 或 class Foo(object, metaclass=something...假设有一个需求是将左右的类的属性,都处理成大写的,演进过程如下: 给 module 指定一个 __metaclass__ 处理方法 # the metaclass will automatically...metaclass 内部,经过处理的结果最终输出到另一个系统中。
今天小明哥要分享的主题是:改变类定义的神器-metaclass 看到标题,你可能会想改变类的定义有什么用呢?什么时候才需要使用metaclass呢?...metaclass到底是什么 那type和metaclass有什么关系呢?metaclass到底是什么呢?...如果是,Python会通过__metaclass__创建一个名字为Foo的类(对象) 如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作...如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。...总结 这次分享主要是简单的浅析了 metaclass 的实现机制。通过实现一个orm框架并解读 YAML 的源码,相信你已经对metaclass 有了不错的理解。
三、__metaclass__属性 你可以在写一个类的时候为其添加__metaclass__属性。...如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。...如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。...如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。 现在的问题就是,你可以在__metaclass__中放置些什么代码呢?答案就是:可以创建一个类的东西。...upperattr_metaclass,这并没有什么特别的。
前言 元类的概念 使用元类的基本步骤 元类的基本语法 通过type类创建元类 元类的应用场景 具体案例 结束语 前言 众所周知,Python是一种灵活且强大的编程语言,而在Python编程中,元类(metaclass...创建类:使用元类来创建类时,需要在类定义中指定元类,可以通过metaclass关键字参数来指定元类。...2、使用元类 要使用元类,首先需要在定义类时将元类指定为metaclass关键字参数。...然后使用元类MyMeta创建了一个名为MyClass的类,并使用metaclass关键字参数指定元类。最后,创建了一个MyClass的实例my_obj,并打印了该实例的version属性。...然后,我们使用元类ModelMeta创建了一个名为Model的基类,并使用metaclass关键字参数指定元类。
__new__(cls, name, bases, attrs) 35 class Model(dict, metaclass=ModelMetaclass): 36 37 def __init
用一个图来表示对象(obj,或叫实例)、类(class)、元类(Metaclass)的关系。...学到这,就是掌握了使用 type 动态创建类的入门学习了~ 自定义元类(metaclass) 如果想把一个类设计成 MetaClass 元类,其必须符合以下条件: 必须显式继承自 type 类; 类中需要定义并实现...__new__(cls, name, bases, attrs) # 定义一个类,指定metaclass 元类创建,而不是由 type 创建 class NewDemo(object, metaclass...__new__(cls, name, bases, attrs) # 定义一个类,指定metaclass 元类创建,而不是由 type 创建 class NewDemo(object, metaclass...Use this metaclass to create an ABC.
引言:在Python编程中,元类(Metaclass)是一项高级特性,它允许我们在定义类的时候动态地控制类的创建过程。...__new__(cls, name, bases, attrs)class BaseModel(metaclass=ModelMetaClass): passclass User(BaseModel...__new__(cls, name, bases, attrs)class Interface(metaclass=InterfaceMetaClass): passclass MyInterface
如果希望创建某一批类全部具有某种特征,则可以通过 metaclass来实现。使用 metaclass可以在创建类时动态修改类定义。...为了使用 metaclass动态修改类定义,程序需要先定义 metaclass, metaclass应该继承type类,并重写new()方法。 下面程序定义了一个 metaclass类。...__new__(cls, name, bases, attrs) # 定义House类 class House(metaclass=MyMetaClass): __slots__ = ('name...运行这段代码,会输出如下的内容: 1780000.0 76.8 从上面的输出结果来看,通过使用 metaclass可以动态修改程序中的一批类,对它们集中进行某种修改。...这个功能在开发一些基础性框架时非常有用,程序可以通过使用 metaclass为某一批需要具有通用功能的类添加属性和方法。
领取专属 10元无门槛券
手把手带您无忧上云