Python 中 __init__() 方法只调用一次

2 投票
4 回答
7762 浏览
提问于 2025-04-17 05:12

有没有办法让一个类的 init() 方法只被调用一次?或者我该如何在创建类的对象时禁用 init() 的调用?

4 个回答

1

你不应该在 __init__() 里放那些只想运行一次的东西。每次你创建一个类的实例时,__init__() 都会被执行。

如果你想自定义类的创建过程,可以考虑创建一个 元类。简单来说,这样可以让你定义一个只在类第一次被定义时运行的函数。

2

没有直接的方法可以禁用 __init__,但是有一些变通的方法可以解决这个问题。其中一种方法是使用一个标志:

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

不过这样看起来不太好。你到底想要实现什么呢?

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

撰写回答