新风格类的Borg设计
我遇到了一个叫做 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 版本也能用。)