草庐IT

metaclass

全部标签

python - 为什么类定义的元类关键字参数接受可调用对象?

背景Python3documentation清楚地描述了一个类的元类是如何确定的:ifnobasesandnoexplicitmetaclassaregiven,thentype()isusedifanexplicitmetaclassisgivenanditisnotaninstanceoftype(),thenitisuseddirectlyasthemetaclassifaninstanceoftype()isgivenastheexplicitmetaclass,orbasesaredefined,thenthemostderivedmetaclassisused因此,根据第二

python - 类方法对象如何工作?

我很难理解类方法对象在Python中是如何工作的,尤其是在元类的上下文中和__new__中。在我的特殊情况下,当我遍历提供给__new__的members时,我想获得类方法成员的名称。对于普通方法,名称只是存储在__name__属性中,但对于类方法,显然没有这样的属性。我什至没有看到类方法是如何被调用的,因为也没有__call__属性。有人可以向我解释类方法的工作原理或向我指出一些文档吗?谷歌搜索让我无处可去。谢谢! 最佳答案 classmethod对象是一个描述符。您需要了解描述符的工作原理。简而言之,描述符是一个对象,它有一个方

python - 类属性显然没有继承

在最近的一个项目中,我尝试做这样的事情(更复杂,但结果相同):classMetaA(type):def__new__(cls,name,args,kwargs):printkwargs["foo"]returntype.__new__(cls,name,args,kwargs)classA(object):__metaclass__=MetaAfoo="bar"classB(A):pass我明白了:barTraceback(mostrecentcalllast):File"C:\Users\Thorstein\Desktop\test.py",line10,inclassB(A):Fi

python 3.2 插件工厂 : instantiation from class/metaclass

我是从这里的信息中提取的:Metaclassnotbeingcalledinsubclasses我的问题是我无法使用此类注册表创建对象的实例。如果我使用“常规”构造方法,那么它似乎正确地实例化了对象;但是当我尝试使用与注册表关联的类对象时,我收到错误消息,提示我传递的参数数量不正确。(似乎是在调用元类new而不是我的构造函数...??)我不清楚它失败的原因,因为我认为我应该能够使用“可调用”语法从类对象创建一个实例。似乎我正在将元类而不是类本身放入注册表中?但是我没有看到在new调用中访问类本身的简单方法。这是我的代码示例,它无法实例化变量“d”:registry=[]#listofs

python - type.__setattr__ 与 object.__setattr__ 有何不同?

type.__setattr__用于类,基本上是元类的实例。另一方面,object.__setattr__用于类的实例。这是完全明白的。我看不出这两种方法有什么显着差异,至少在Python级别,我注意到这两种方法使用相同的过程来分配属性,如果我错了请纠正我:假设a是一个用户定义类的实例,只是一个普通类:classA:passa=A()a.x=...然后a.x=..调用type(a).__setattr__(...)执行以下步骤:注意:type(a).__setattr__将在object内置类中找到__setattr__1)在type(a).__mro__中查找数据描述符。2)如果找到

python - 如何确定一个类的元类?

我有一个类对象,cls。我想知道它的元类。我该怎么做?(如果我想知道它的父类,我会做cls.__mro__。有这样的东西来获取元类吗?) 最佳答案 好的-所以,一个类的元类只是它自己的“类型”,可以由type(cls)和其他方式,例如cls.__class__。在Python3.x中没有进一步的歧义——因为创建元类的语法只是将它作为命名参数传递给类声明语句。但是,用于在Python2.x中创建元类的语法会产生一个值得注意的副作用。做完classA(object):__metaclass__=MyMeta__metaclass__属性

python - 在 Python 运行之前覆盖默认的 type() 元类

这里有龙。您已收到警告。我正在考虑创建一个新库,以尝试帮助编写更好的测试套件。为了做到这一点,其中一个功能是验证正在使用的任何对象不是测试运行器和systemundertest的功能。有一个测试替身(模拟对象、stub、假对象或虚拟对象)。如果测试人员想要事件对象并因此减少测试隔离,则必须明确指定。我看到的唯一方法是覆盖内置的type()函数,它是默认的元类。新的默认元类将检查测试替身注册表字典以查看它是否已被替换为测试替身或者是否指定了事件对象。当然,这通过Python本身是不可能的:>>>TypeError:can'tsetattributesofbuilt-in/extensio

python - `__metaclass__ = type` 的目的是什么?

Python(仅限2?)查看变量__metaclass__的值以确定如何从类定义创建type对象。Itispossibletodefine__metaclass__atthemoduleorpackagelevel,在这种情况下,它适用于该模块中的所有后续类定义。然而,我在flufl.enum中遇到了以下情况包裹的__init__.py:__metaclass__=type如果未定义__metaclass__,默认的元类是type,这不会没有效果吗?(如果__metaclass__在更高的范围内被分配,这个分配将恢复为默认值,但我没有看到这样的分配。)它的目的是什么?

python - 元类的继承

在这个众所周知的answer这解释了Python中的元类。它提到__metaclass__属性不会被继承。但事实上,我在Python中尝试过:classMeta1(type):def__new__(cls,clsname,bases,dct):print"UsingMeta1"returntype.__new__(cls,clsname,bases,dct)#"UsingMeta1"printedclassFoo1:__metaclass__=Meta1#"UsingMeta1"printedclassBar1(Foo1):pass正如预期的那样,Foo和Bar都使用Meta1作为元类

python - 重写类的 __contains__ 方法

我需要在Python中模拟枚举,并通过编写如下类来实现:classSpam(Enum):k=3EGGS=0HAM=1BAKEDBEANS=2现在我想测试某个常量是否是特定Enum派生类的有效选择,语法如下:if(xinFoo):print("seemslegit")因此,我尝试创建一个“枚举”基类,在其中重写__contains__方法,如下所示:classEnum:"""Simulatesanenum."""k=0#overwriteinsubclasswithnumberofconstants@classmethoddef__contains__(cls,x):"""Testfor