Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅在基类中运行初始化_Python_Inheritance - Fatal编程技术网

Python 仅在基类中运行初始化

Python 仅在基类中运行初始化,python,inheritance,Python,Inheritance,我希望有一个只在基类中运行,但不在子类中运行的\uuu init\uu()方法 根据此处的代码: 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并不是

我希望有一个只在基类中运行,但不在子类中运行的
\uuu init\uu()
方法

根据此处的代码:

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
不做的事情

也许双重继承是解决方案。让base从
i\u print\u继承一个\u init\u消息
类,并将
\u init\u()放入其中。尽管这似乎有些过分

另外,检查类的名称以查看名称是否为
base
似乎很麻烦

或者,我可能只是在init中有一个默认为
False
的参数

有没有什么特别像蟒蛇一样的方法


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

我认为争论解决方案是最好的。只有使用base的人才知道传递“top”参数,否则我们将获得所需的行为

class base:

    def __init__(self, top=False):
        if top:
            print('Only print this if I am base')

class ext(base):
...

foo = ext()

我认为争论解决方案是最好的。只有使用base的人才知道传递“top”参数,否则我们将获得所需的行为

class base:

    def __init__(self, top=False):
        if top:
            print('Only print this if I am base')

class ext(base):
...

foo = ext()

您可以覆盖
\uuuuu init\uuuuuuu
或使用类似于

class base:
    def __init__(self):
        if self.__class__ == base:
            print('Only print this if I am base')

如果你想
base.\uuuuu init\uuuu
去做
ext.\uuuuuu init\uuuu
不应该做。但这可能是一个信号,你应该改变你的设计。。。(例如,类似于建议的内容)。

您可以覆盖
\uuuu init\uuu
或使用类似于

class base:
    def __init__(self):
        if self.__class__ == base:
            print('Only print this if I am base')

如果你想
base.\uuuuu init\uuuu
去做
ext.\uuuuuu init\uuuu
不应该做。但这可能是一个信号,你应该改变你的设计。。。(例如,类似于建议的内容)。

如果确实要这样做,只需在派生类中定义一个重载基类构造函数的构造函数:

class base:
    def __init__(self):
        print ('base')


class ext(base):
    def __init__(self):
        print('ext')


foo = ext()
它产生输出:

ext
base
ext
与具有以下功能的构造函数相反:

class base:
    def __init__(self):
        print ('base')


class ext(base):
    def __init__(self):
        super().__init__()
        print('ext')


foo = ext()
它产生输出:

ext
base
ext

如果确实要这样做,只需在派生类中定义一个重载基类构造函数的构造函数:

class base:
    def __init__(self):
        print ('base')


class ext(base):
    def __init__(self):
        print('ext')


foo = ext()
它产生输出:

ext
base
ext
与具有以下功能的构造函数相反:

class base:
    def __init__(self):
        print ('base')


class ext(base):
    def __init__(self):
        super().__init__()
        print('ext')


foo = ext()
它产生输出:

ext
base
ext

应该有第三个类作为
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
。您应该能够在任何可以使用其父类实例的地方使用子类的实例。

应该有第三个类同时充当
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
。您应该能够在任何可以使用其父类实例的地方使用子类的实例。

为什么不在
ext
中定义一个不调用基类init的
方法呢?如果您想
ext.\uuu init\uuu
base有不同的行为,然后你需要覆盖它。@Jean-Françoisfar肯定是有可能的,但是如果用户忘记了怎么办?然后在基本初始化的末尾引发一个异常,当你实例化基类时你会发现。我想我是在讨论参数解决方案。为什么不在
ext
中定义一个不调用基类init的
方法呢?如果你想
ext.\uu init\uuu
base有不同的行为,然后你需要重写它。@Jean-Françoisfar肯定是有可能的,但是如果用户忘记了怎么办?然后在基类初始化的末尾引发一个异常,当你实例化基类时,你会发现这个异常。我想我是在说服自己进入参数解决方案。哈!酷的雪崩参考!哈酷的雪崩参考!这看起来比我的黑客更干净。这看起来比我的黑客更干净。这类似于“默默无闻的安全”。您是否可以编写
ext(True)
,这一点可能并不明显,但您确实可以。这类似于“模糊安全”。您是否可以编写
ext(True)
,这可能并不明显,但您确实可以。