调用类函数而不触发__init__

时间:2017-07-23 18:54:10

标签: python python-3.x class

有没有办法调用类中的函数而不触发该类的__init__部分?假设我有下一节课,通常我会用这种方式调用函数:

class Potato():
    def __init__(self):
        print("Initializing")
    def myfunction(self):
        print("I do something")

Potato().myfunction()

但正如预期的那样,打印出初始化部分。现在,如果我想调用myfunction而不触发它。你会怎么做?这样做的优点和缺点?它甚至可能吗?

3 个答案:

答案 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()