2012-01-24 20 views
4

我遇到了Borg design,認爲它適合我在做的事情,但是在使用時我得到DeprecationWarning(我目前使用的是Python 2.6,但會移動到不久的將來更新版本)。Borg新款式的設計

在評論中發現的新的風格的版本是:

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__()

+2

「認爲這會適合我在做什麼「?爲什麼?你有什麼目的? 99%的時間您可以更簡單地使用全局模塊。 –

+0

單身只不過是一種創建全局變量的方式,就像您正在創建一個類的新實例一樣,爲了讓其他開發人員(稍後自己將其引入)將錯誤引入到您的軟件中,可以將其混淆。我以前從來沒有聽說過博格,但它似乎只是更多。只需定義你的類,然後直接將它實例化成一個全局模塊。所有對全球的引用將共享狀態。魔法! – Ben

+0

我正在擴展一個類(不是我的),因爲這個項目只能被允許擁有一個類。做了一些研究,我偶然發現了問題中的鏈接,並認爲我會試試它而不是Singleton。老實說,我沒有想到將模塊用作「單身人士」。這會比使用博格容易嗎? – TorelTwiddler

回答

5

您不必將參數傳遞給__new__,它們將自動傳遞到__init__。無論如何,object.__new__並不使用這些參數。以下是the man himself說對此事:

有與多類 參數調用對象.__新__()是沒有意義的,而這樣做的任何代碼只是被傾倒的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工作爲好。)

+0

「super」調用依賴MRO中下一個對象的正確性(否則應該傳遞這些參數)。所以恕我直言,最好是明確的,直接調用'object'。 – Ben

+0

@本,這是一個很好的觀點。如果我們沒有傳遞參數,那麼除了調用「object .__ new__」之外的任何東西都可能沒有什麼意義。我將編輯答案以反映這一點。 –

+0

這完美地解決了這個問題,謝謝! – TorelTwiddler