【问题标题】:Calling a class function without triggering the __init__调用类函数而不触发 __init__
【发布时间】:2017-12-29 08:14:17
【问题描述】:

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

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

Potato().myfunction()

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

【问题讨论】:

  • 什么...那就不要使用__init__。无论如何,您都没有在该示例中初始化任何变量。
  • 这只是一个例子,我想知道如果真正的代码中有变量会发生什么,但我不想在调用函数时调用它们。或者,如果有可能的话。
  • 您不会“调用”变量。 __init__“初始化”。这意味着一旦您实例化一个类,该特定实例就会获得您初始化为属性的任何变量。我不知道您所说的“调用函数时不调用它们”是什么意思。
  • 对不起,我的主要语言不是英语。我只是想知道当你实例化一个类时是否有办法排除一个类的__init__ 函数。希望这更有意义。 @Trauer 可能,我正在学习课程以及它们是如何工作的,我偶然发现了这一点。我知道有更好的方法来调用函数,但我只是想解决我对“有可能做到这一点......?”的好奇心。
  • 您可以创建一个覆盖__init__ 方法的子类以不执行任何操作...但不确定重点是什么。

标签: python python-3.x class


【解决方案1】:

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

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

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

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

MyClass.my_static("Print this")

【讨论】:

  • 可能是这样,需要解释一下吗?
  • 我添加了一个示例来演示静态方法的使用
  • 这是我要走的路。我不知道你为什么会使用接受的答案。
  • 哦,这是一个新手失败:我实际上做了 2 个答案。第一个是如果甚至可以不初始化__init__,所以我接受了答案,因为我必须知道关于这个问题的类的能力,并且很好地涵盖了这一点。那么另一个问题是如何在不初始化类的情况下调用类内部的方法,在这件事上我同意这很高兴知道。
  • 2 个问题,而不是答案。哇,我昨天就这么傻……?
【解决方案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

【讨论】:

  • 这就是我需要知道的,如果有可能的话。谢谢。
  • @Saelyth 很高兴有帮助。添加了另一种您可能会觉得有用的方法。
  • 很好的解决方案!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 2011-08-31
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多