新风格类的Borg设计

4 投票
1 回答
1240 浏览
提问于 2025-04-17 10:59

我遇到了一个叫做 Borg 设计 的东西,觉得它很适合我正在做的事情。不过,当我使用它的时候,出现了一个 DeprecationWarning 的警告(我现在在用 Python 2.6,但很快会升级到新版本)。

在评论里找到的新版本是:

class Borg(object):
    _state = {}
    def __new__(cls, *p, **k):
        self = object.__new__(cls, *p, **k)
        self.__dict__ = cls._state
        return self

但是,当我用参数创建一个实例时,又出现了 DeprecationWarning

DepricationWarning: object.__new__() takes no parameters

有没有办法在不使用 object.__new__() 带参数的情况下使用 Borg 设计呢?

1 个回答

5

你不需要把参数传给 __new__,这些参数会自动传给 __init__。其实 object.__new__ 根本不使用那些参数。这里有位大佬的原话:

调用 object.__new__() 时,除了类参数之外没有其他意义,任何传入其他参数的代码都是在往黑洞里扔东西。

所以你只需要这样做:

class Borg(object):
    _state = {}
    def __new__(cls, *p, **k):
        self = object.__new__(cls)
        self.__dict__ = cls._state
        return self

    def __init__(self, foo):
        print(foo)

测试一下:

>>> import borg
>>> b = borg.Borg(foo='bar')
bar

(只在 2.7 版本测试过,假设 2.6 版本也能用。)

撰写回答