博格设计与新式课程

时间:2012-01-24 18:43:10

标签: python

我遇到了Borg design并且认为它与我正在做的很相配,但是当我使用它时我得到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

但是,使用参数创建实例时会提供DepricationWarning

DepricationWarning: object.__new__() takes no parameters

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

1 个答案:

答案 0 :(得分:5)

您不必将参数传递给__new__,它们会自动传递给__init__object.__new__无论如何都不会使用这些参数。以下是the man himself在此问题上所说的内容:

  

使用多个类调用object .__ new __()是没有意义的   参数,以及执行此操作的任何代码只是将这些args转储到   黑洞。

所以只需这样做:

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。)