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