【问题标题】:Python call __init__() method only one timePython 只调用一次 __init__() 方法
【发布时间】:2011-10-28 16:31:08
【问题描述】:

有没有办法只调用一次类的init()方法。或者当我从类创建对象时如何禁用 init() 调用?

【问题讨论】:

  • 你的意思是你想要一个单身人士?
  • __init__ 将始终在对象构造时被调用。这就是它的用途。如果您尝试只调用一次,那么您的逻辑可能存在缺陷。如果您发布您想要实现的目标,我们可能会帮助您提出更正确的解决方案
  • __init__ 的目的是在您创建类的实例时触发。更具体地说明您在此处尝试执行的操作。
  • 我想他想避开Foobar().__init__( ... )
  • 这是您想在第一次创建对象时运行的东西,然后再也不会运行,还是您想在创建类时运行它?如果是后者,请尝试查看 Metaclasses。以下 SO 答案是对元类的一个很好的介绍:stackoverflow.com/questions/100003/…

标签: python init


【解决方案1】:

如果您想要一个单例,其中只有一个类的实例,那么您可以创建一个装饰器,如下所示,从PEP18 获得:

def singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return getinstance

@singleton
class MyClass:
    pass

试试看:

>>> a = MyClass()
>>> b = MyClass()
>>> a == b
True

【讨论】:

    【解决方案2】:

    没有直接的方法可以禁用__init__,但有几种方法可以解决这个问题。其中一个有一面旗帜:

    class Class:
        _init_already = False
        __init__(self):
            if not Class._init_already:
                ...
                Class._init_already = True
    

    但这很丑。您真正想要完成的是什么?

    【讨论】:

      【解决方案3】:

      您不应该在__init__() 中添加任何您只想运行一次的内容。每次创建类的实例时,__init__() 都会运行。

      如果你想自定义你的类的创建,你应该考虑创建一个metaclass。基本上,这允许您定义一个仅在首次定义类时运行一次的函数。

      【讨论】:

        【解决方案4】:

        init 方法将始终被调用,但是您可以创建另一个名为 run() 的方法或其他方法,您可以在创建对象后调用该方法,可选。

        foo = ClassName()
        foo.run() # replacement for __init__
        
        foo2 = ClassName()
        

        【讨论】:

          猜你喜欢
          • 2019-09-24
          • 1970-01-01
          • 2014-06-07
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多