我甚至不知道如何解释这个,所以这里是我正在尝试的代码。
from couchdb.schema import Document, TextField
class Base(Document):
type = TextField(default=self.__name__)
#self doesn't work, how do I get a reference to Base?
class User(Base):
pass
#User.type be defined as TextField(default="Test2")
我甚至尝试这个的原因是我正在为我正在使用的orm创建一个基类。我想避免为我拥有的每个模型定义表名。也知道python的限制将有助于我避免浪费时间尝试不可能的事情。
答案 0 :(得分:3)
类对象在执行类主体时尚未存在,因此类主体中的代码无法获取对它的引用(就像更常见的是,没有任何代码的代码)获取对任何不存在的对象的引用。但是,Test2.__name__
已经完成了您正在寻找的内容,因此我认为您不需要针对特定用例的任何解决方法(例如元类或类装饰器)。
编辑:对于编辑过的问题,您不需要将名称作为字符串,类装饰器是解决问题的最简单方法(在Python 2.6或更高版本中):
def maketype(cls):
cls.type = TextField(default=cls.__name__)
return cls
并将@maketype
放在要以这种方式装饰的每个类的前面。在Python 2.5或更早版本中,您需要在每个相关的maketype(Base)
语句之后说出class
。
如果您希望继承此功能,则必须定义一个自定义元类,该元类在其__init__
或__new__
方法中执行相同的功能。就个人而言,我建议不要定义自定义元类,除非它们真的是必不可少的 - 相反,我会坚持使用更简单的装饰器方法。
答案 1 :(得分:0)
您可能想查看另一个问题python super class relection
在你的情况下,Test2 .__ base__将返回基类Test。如果它不起作用,您可以使用新样式:class Test(object)