1

这是一个奇怪的问题。我曾遇到过几次想在__init__python 对象末尾执行一些操作的情况。我只想将动作作为__init__真正类(叶类)中的最后一件事。__init__如果在 self方法的超类中,我绝对不想这样做。有没有好的方法来做到这一点?我承认这可能是一件愚蠢的事情。但这让我很好奇它是否以及如何完成。

4

1 回答 1

5

如果你想让一些代码在叶子类中运行,在 的末尾__init__,而不是在基类中运行……只需__init__在叶子类中覆盖。例如:

class Base(object):
    def __init__(self):
        print('Base initializing')
class Intermediate(Base):
    pass
class Leaf(Intermediate):
    def __init__(self):
        super(Leaf, self).__init__()
        print('Leaf initializing')

>>> o = Base()
Base initializing
>>> o = Intermediate()
Base initializing
>>> o = Leaf()
Base initializing
Leaf initializing

如果您尝试以编程方式检测,从类似的方法Base.__init__中,是否self是......的一个Base或某个子类Base,通常这是一个坏主意,并且您实际上想使用方法覆盖,如上所述。但这很容易做到。例如:

class Base(object):
    def __init__(self):
        if type(self) != Base:
            print('Some subclass of Base initializing')
class Leaf(Base):
    pass

>>> obj = Leaf()
Some subclass of Base initializing

(如果您担心有人可能会破坏您的层次结构,以至于某个既不是它的 a 也不是它的子类的对象最终Base 可能会调用Base.__init__检查issubclass。)


如果您尝试在类似的方法中以编程方式检测Base.__init__base 是否是“真正的类”……那么,您需要定义这意味着什么。这是否意味着“不是 PEP3119 意义上的抽象基类”?“还没有定义子类”?“有一些关键方法的实现”?你想做的任何事情都可能是可行的,但有些会比其他人更难。(例如,要检测是否有人对您的类进行了子类化,您可能需要构建一个自定义元类。)

于 2013-03-28T20:06:26.510 回答