有没有办法调用类中的函数而不触发该类的__init__
部分?假设我有下一节课,通常我会用这种方式调用函数:
class Potato():
def __init__(self):
print("Initializing")
def myfunction(self):
print("I do something")
Potato().myfunction()
但正如预期的那样,打印出初始化部分。现在,如果我想调用myfunction而不触发它。你会怎么做?这样做的优点和缺点?它甚至可能吗?
答案 0 :(得分:7)
不确定这是否是您要找的,但是:
可以在不创建类实例的情况下使用classmethod或static方法 - 这意味着不会以这种方式调用 init :
class MyClass:
def __init__(self):
print("Initialize instance - not used")
@staticmethod
def my_static(toprint):
print(toprint)
MyClass.my_static("Print this")
答案 1 :(得分:7)
是的,这是可能的。
你可以编写一个辅助函数,用一个伪方法替换你的类的__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
答案 2 :(得分:0)
1)您可以创建一个没有 init 的类,但它的行为更像是一个函数。
2)如果使用__init__
方法,那么每次调用类时都会调用它,但是如果你这样选择的话,可以避免它触发变量。请注意,该方法仍将被调用。
class Potato():
def __init__(self,init_or_dont=1):
self.init_or_dont = init_or_dont
if self.init_or_dont:
print("Initializing")
def myfunction(self):
print("I do something")
Potato(init_or_dont=0).myfunction()