是的,这是可能的。
使用辅助函数
您可以编写一个辅助函数,将您的类的__init__
方法替换为虚拟方法,然后实例化该类,之后再将旧的__init__
重新赋回给类。
def skip_init(cls):
actual_init = cls.__init__
cls.__init__ = lambda *args, **kwargs: None
instance = cls()
cls.__init__ = actual_init
return instance
演示:
>>> a = skip_init(Potato)
>>> a.myfunction()
I do something
覆盖__new__
您可以覆盖类的__new__
方法,并基于参数替换__init__
为一个虚拟方法。
def new_init(cls, init):
def reset_init(*args, **kwargs):
cls.__init__ = init
return reset_init
class Potato():
def __new__(cls, *args, **kwargs):
instance = object.__new__(cls)
lazy = kwargs.pop('_no_init', False)
if not lazy:
return instance
cls.__init__ = new_init(cls, cls.__init__)
return instance
def __init__(self):
print("Initializing")
def myfunction(self):
print("I do something")
示例:
>>> a = Potato(_no_init=True)
>>> a.myfunction()
I do something
>>> b = Potato()
Initializing
>>> b.myfunction()
I do something
__init__
。在该示例中,您根本没有初始化任何变量。 - Wright__init__
是“初始化”的意思。这意味着,一旦你实例化一个类,该特定实例就会获得你初始化为属性的任何变量。我不知道你所说的“在调用函数时不调用它们”的意思。 - Wright__init__
函数。希望这样更有意义。@Trauer 可能吧,我正在学习类及其工作原理,然后遇到了这个问题。我知道有更好的调用函数的方法,但我只是想满足我的好奇心,“这样做可能吗?” - Saelyth__init__
方法并什么也不做...虽然不确定这样做的意义何在。 - kindall