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)
,这可能并不明显,但您确实可以。