如何在Python中自引用一个类?

时间:2015-02-03 10:34:45

标签: python

我希望此Template类接受type(i) in self._allowed_types的自身和其他类型的子项。

class Template():
    _allowed_types = [str, Template, SafeHtml]

上面的代码抛出了这个:

NameError: name 'Template' is not defined

3 个答案:

答案 0 :(得分:6)

在定义类后添加类:

class Template():
    _allowed_types = [str, SafeHtml]

Template._allowed_types.append(Template)

必要时,类体在可以创建类对象之前运行,因此名称Template未定义尚未。但是,您可以在创建对象后始终更改类属性。

答案 1 :(得分:0)

另一种(也许是更清洁的)方式是声明一个中间类:

class BasicTemplate():
    pass

class Template(BasicTemplate):
    _allowed_types = [str, BasicTemplate]

BasicTemplate可以是完全虚拟的,或者包含一些有用的代码。拥有一个的模板允许包含它自己可能在某些时候派上用场。

当然,这需要isinstance代替type()来检查类型,但无论如何这都是个好主意。

答案 2 :(得分:0)

另一种选择是使用属性来对该字段进行延迟。

class Test(object):
    @property
    def allowed(self):
        return [str, Test]

t = Test()
print Test in t.allowed