仅在基类中运行__init__

时间:2018-11-30 16:06:53

标签: python inheritance

我想拥有一个__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方式?

(请假设我已经回答了所有“为什么要这样做?”评论。谢谢!)

4 个答案:

答案 0 :(得分:2)

可能应该有第三类充当baseext的父类。

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