有没有办法只调用一次类的 init ()方法。或者,当我从类中创建对象时,如何禁用 init ()的调用?
答案 0 :(得分:7)
如果你想要一个单身,那里只有一个类的实例,那么你可以创建一个像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
答案 1 :(得分:2)
没有直接的方法来禁用__init__
,但有几种方法可以解决这个问题。其中一个是旗帜:
class Class:
_init_already = False
__init__(self):
if not Class._init_already:
...
Class._init_already = True
但这很难看。你真正想要完成的是什么?
答案 2 :(得分:1)
你不应该在__init__()
中放置任何你只想运行一次的东西。每次创建类__init__()
的实例都将运行。
如果您想自定义课程的创建,您应该考虑创建metaclass。基本上,这允许您定义一个仅在首次定义类时运行一次的函数。
答案 3 :(得分:0)
将始终调用init方法,但是您可以创建另一个名为run()的方法,或者在创建对象后调用的方法,可选。
foo = ClassName()
foo.run() # replacement for __init__
foo2 = ClassName()