我想拥有一个__init__()
方法,该方法仅在基类中运行,而在子类中不运行。
在此处提供代码:
class base:
def __init__(self):
print('Only print this if I am base')
class ext(base):
...
foo = ext()
我得到以下结果:
Only print this if I am base
我不是,所以那不是我想要的。
解决方案可能只是一个更好的体系结构。显然,ext
并不是base
的扩展名,因为base
做的事情ext
做不了。
也许双重继承是解决方案。使基类继承自i_print_an_init_message
类,并将__init__()
放在那里。虽然这似乎有些矫kill过正。
还要检查类的名称以查看其名称是否为base
似乎很糊涂。
或者,也许我在初始化中只有一个参数,默认为False
。
是否有任何特别的Python方式?
(请假设我已经回答了所有“为什么要这样做?”评论。谢谢!)
答案 0 :(得分:2)
可能应该有第三类充当base
和ext
的父类。
class RealBase:
def __init__(self):
...
class Base(RealBase):
def __init__(self):
print('Only print this if I am base')
class Ext(RealBase):
def __init__(self):
...
如果 Ext
的实例不是Base
的实例,则不应扩展Base
。您应该可以在任何可以使用父类实例的地方使用子实例的实例。
答案 1 :(得分:1)
您可以覆盖__init__
或用类似的方法来破解它
class base:
def __init__(self):
if self.__class__ == base:
print('Only print this if I am base')
如果您希望base.__init__
做某事ext.__init__
,则不应该这样做。但这可能表明您应该更改设计...(例如,chepner's answer的建议)。
答案 2 :(得分:0)
我认为参数解决方案是最好的。只有使用基础的人才能知道传递“ top”参数,否则我们将获得所需的行为。
class base:
def __init__(self, top=False):
if top:
print('Only print this if I am base')
class ext(base):
...
foo = ext()
答案 3 :(得分:0)
如果您确实想这样做,则只需在派生类中定义一个重载基类的构造函数的构造函数:
class base:
def __init__(self):
print ('base')
class ext(base):
def __init__(self):
print('ext')
foo = ext()
哪个产生输出:
ext
与执行以下操作的构造函数相反:
class base:
def __init__(self):
print ('base')
class ext(base):
def __init__(self):
super().__init__()
print('ext')
foo = ext()
产生输出:
base
ext