【发布时间】:2017-12-13 12:47:18
【问题描述】:
这是我在几种语言中都错过的一个功能,想知道是否有人知道如何在 Python 中完成它。
这个想法是我有一个基类:
class Base(object):
def __init__(self):
self.my_data = 0
def my_rebind_function(self):
pass
还有一个派生类:
class Child(Base):
def __init__(self):
super().__init__(self)
# Do some stuff here
self.my_rebind_function() # <==== This is the line I want to get rid of
def my_rebind_function(self):
# Do stuff with self.my_data
从上面可以看出,我有一个反弹函数,我想在Child.__init__ 完成它的工作之后调用它。我希望对所有继承的类都这样做,所以如果它由基类执行会很棒,所以我不必在每个子类中重新键入该行。
如果该语言有一个像__finally__ 这样的函数就好了,它的运行方式类似于它在异常情况下的运行方式。也就是说,它应该在所有__init__-functions(所有派生类的)都运行之后运行,那太好了。所以调用顺序是这样的:
Base1.__init__()
...
BaseN.__init__()
LeafChild.__init__()
LeafChild.__finally__()
BaseN.__finally__()
...
Base1.__finally__()
然后对象构造就完成了。这也有点类似于使用setup、run 和teardown 函数进行单元测试。
【问题讨论】:
-
你想在子类中重写这个方法吗?
-
不,我想要在调用所有子级的 init 函数之后调用另一个函数。
-
你可以用元类来做到这一点,虽然更复杂:\
-
如果你把
self.my_rebind_function()放在基类中__init__(),当它被派生类的调用时,它会调用派生类版本的my_rebind_function()__init__(). -
@martineau:是的,当然,但这不是我想要的。我希望它在派生类
__init__-method 之后调用。
标签: python python-3.x class constructor