我需要定义一个类变量,名为“class”。我想直接在类命名空间中执行此操作,而不是在类方法中。显然,我不能直接说:
class MyClass(object):
a = 1
b = 2
class = 3
所以,我想做些类似的事情:
^{pr2}$其中“self
”应替换为对类的引用。那么,如何从类名称空间引用类呢?在
注意:这个问题可能看起来有些做作,但它源于一个实际的目标。在
实际上,MyClass
是一个Django REST框架序列化程序,我需要在其上定义一个“class”字段,因为这个REST端点必须遵循某种协议。在
有一个为序列化程序定义的元类,它在类创建时调用__new__()
,并且{class
。另请参见:Django REST Framework: how to make verbose name of field differ from its field_name?
不需要将属性命名为
class
,这可能会导致各种问题。您可以将属性命名为class_
,但仍要将其从名为class
的源属性中提取出来,并以class
的形式呈现为JSON。在可以通过重写序列化程序的元类来实现这一点。下面是一个
serializers.py
文件的示例(模型和类很大程度上是直接从tutorial中提取出来的)。在主要的魔法是元类的这一部分
这将获取您在序列化程序中定义的以下划线结尾的任何字段(即
^{pr2}$field_
),并在绑定Fields
并在序列化程序上设置_declared_fields
属性时从名称中删除下划线。在这是模型.py引用文件(django不允许字段名以下划线结尾)
这就是django shell的外观
你可以:
但是由于}来访问变量,这样
^{pr2}$class
是一个保留关键字,因此必须使用getattr
和{class
仍然是一个字符串。在您可以从
type
创建类,并将属性class
添加到类字典中:不能用点引用直接访问名称
^{pr2}$class
,需要使用getattr
:FWIW中,您可以像通常那样定义类方法,然后在以后将它们绑定到类。在
注意事项:虽然这是可行的,但我自己不会使用这个黑客攻击,因为关键字
class
是一个太多的关键字,不能篡改。在相关问题 更多 >
编程相关推荐