Python 在类定义中获取类
我都不知道该怎么解释这个,所以我直接把我正在尝试的代码放这里。
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的限制也能帮助我避免浪费时间去尝试一些不可能实现的事情。
2 个回答
0
你可以看看另一个问题,链接在这里:python 超类反射
在你的情况下,Test2.__base__ 会返回它的父类 Test。如果这样不行,你可以试试新的写法:class Test(object)
3
在执行类的代码时,这个类的对象还不存在,所以在类的代码里没有办法获取到这个对象的引用。就像更一般的情况一样,任何代码都无法获取到一个不存在的对象的引用。不过,Test2.__name__
已经可以满足你具体的需求,所以我觉得你不需要使用其他的解决办法(比如元类或类装饰器)来处理你的特定情况。
编辑:针对编辑后的问题,如果你不仅仅需要类名作为字符串,那么使用类装饰器是解决这个问题的最简单方法(在Python 2.6或更高版本中):
def maketype(cls):
cls.type = TextField(default=cls.__name__)
return cls
然后在你想要以这种方式装饰的每个类前面加上@maketype
。在Python 2.5或更早版本中,你需要在每个相关的class
语句后面写maketype(Base)
。
如果你希望这个功能能够被继承,那么你需要定义一个自定义的元类,在它的__init__
或__new__
方法中实现相同的功能。个人来说,我不太建议定义自定义的元类,除非真的非常必要——我更倾向于使用更简单的装饰器方法。