在不触发 __init__ 的情况下调用类函数

新手上路,请多包涵

有没有什么方法可以在不触发该类的 __init__ 部分的情况下调用类内的函数?假设我有下一节课,通常我会这样调用函数:

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

Potato().myfunction()

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

原文由 Saelyth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 602
2 个回答

对的,这是可能的。

使用辅助函数

您可以编写一个辅助函数,用虚拟方法替换您的类的 __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

原文由 Ashwini Chaudhary 发布,翻译遵循 CC BY-SA 3.0 许可协议

不确定这是否是您要找的,但是:

可以在不创建类实例的情况下使用类方法或静态方法——这意味着不会以这种方式调用 init

 class MyClass:
   def __init__(self):
      print("Initialize instance - not used")

   @staticmethod
   def my_static(toprint):
       print(toprint)

MyClass.my_static("Print this")

原文由 DonGru 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题