gpt4 book ai didi

python - 可以防止调用 init 吗?

转载 作者:太空狗 更新时间:2023-10-29 22:04:20 27 4
gpt4 key购买 nike

我正在编辑原始问题,因为我们都在关注您是否应该这样做。我的问题很简单,我能做到吗以及如何做到(了解可能有多种解决方案)。所以我将离开实际问题并删除背景。

假设我有一个基类和一个子类。我可以在基类中做些什么来防止 __init__ 在子类上被调用——或者至少抛出异常,甚至记录 __init__ 是否存在或在子类上被调用?我确实希望在父类上调用 __init__ 方法。

编辑/结论 - 在探索了答案中提供的选项后,我认为这样做是不好的风格。我将以不同的方式解决我的问题。尽管如此,如果其他人想要这样做,希望下面的答案对您有所帮助。

最佳答案

“我是否应该或需要这样做是一个单独的讨论:)”

请记住这一点。

但是可以做到——当一个类被实例化时,不仅语法就像方法调用 - 类对象名称后跟一个括号 - 类本身(它是一个 Python 对象)被称为 - 作为可调用对象。

在 Python 中调用对象会调用其类中的 __call__ 魔法方法。因此,实例化一个类,调用其元类上的 __call__ 方法。

标准元类中的 __call__ 方法的内容(即“type”)大致等同于:

def __call__(cls, *args, **kw):
self = cls.__new__(cls, *args, **kw)
cls.__init__(self, *args, **kw)
return self

因此,如果您编写一个元类,覆盖 __call__ 并在其中抑制对 __init__ 的调用,它根本不会被调用:

class Meta(type):
def __call__(cls, *args, **kw):
return cls.__new__(cls, *args, **kw)

class NoInit(object):
__metaclass__ = Meta
def __init__(self):
print "Hello!"

NoInit()

如果你只想避免子类有 __init__ 而不是不调用它,你可以做一个更简单的元类,它只会在类实例化时引发异常:

class Meta(type):
def __new__(metacls, name, bases, dct):
if "__init__" in dct:
raise NameError("Classes in this hierarchy should not have an __init__ method")
return type.__new__(metacls, name, bases, dct)

关于python - 可以防止调用 init 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9187388/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com