Python在类定义中抓取类

时间:2010-05-02 01:42:47

标签: python reflection

我甚至不知道如何解释这个,所以这里是我正在尝试的代码。

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 :(得分: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)