2017-06-08 32 views
3

首先:這個問題幾乎涵蓋零用例,並且只是關於病態的好奇心。話雖如此:重複無或其他Python sigleton

我不知道不久之前,如果有可能從Python(或任何其他單身人士,如TrueEllipsis)複製None對象。通過「重複」,我的意思是創建一個精確的副本,而不是對同一個對象的另一個引用。那就是:

>>> noneBis == None 
True 
>>> noneBis is None 
False 

爲什麼我認爲這是可能的,是因爲Python的核心理念:一切都是對象。並且可以複製一個對象。

我已經嘗試了多種方法(比別人更多一些令人費解),無法做到這一點:

>>> copy.deepcopy(None) is None 
True 
>>> types.NoneType() 
TypeError: cannot create NoneType instances 
>>> object.__new__(type(None)) 
TypeError: object.__new__(NoneType) is not safe, use NoneType.__new__() 
>>> types.NoneType.__new__(types.NoneType) 
TypeError: object.__new__(NoneType) is not safe, use NoneType.__new__() 

這似乎相當硬化和瘋狂,科學家,證明給我,但我不知道我有努力嘗試。 (我已經在Python 2.7中進行了測試,但是由於Python 3+被設計爲比Python 2更加傻瓜化,我的猜測是結果不會更好。)

實際上是否可以創建單獨的重複Python單身人士?

+7

好吧,如果你的「複製」的定義很簡單'noneBis == None和noneBis不是None,那麼你只需要創建一個帶有認可的類priate'__eq__'方法。 –

+3

'class NotNone:def __eq __(self,other):return other == None' ... – deceze

+3

「爲什麼我認爲這是可能的,是因爲Python的核心理念:一切都是對象,一個對象可以被複制「。 =>誰曾經說過一個對象可以被複制?章節和詩節? - ) –

回答

2

如果你可以創建一個單身的「副本」,它不會再是一個單身人士了嗎?我不認爲你可以期望「克隆」它們,除非通過fork Python或者類似的方法來實現(克隆)極端的方法。還要注意,由於Python語言明確規定None是單身人士,所以這不再是Python了)

現在,如果所有你想要的東西都是單身人士,並且比較等於None而不是None,這裏有一個可能的(蟒蛇2.7.x)實現:

def __mknone(): 
    _instance = [None] 

    class NotNoneType(object): 
     def __new__(cls): 
      if _instance[0] is not None: 
       raise TypeError("cannot create 'NotNoneType' instances") 
      _instance[0] = object.__new__(cls) 
      return _instance[0] 

     def __eq__(self, other): 
      if other is None: 
       return True 
      return other == _instance[0] 

     def __nonzero__(self): 
      return False 

    return NotNoneType() 

NotNone = __mknone() 
NotNoneType = type(NotNone) 
del __mknone 

告訴我,如果你能設法BTW創建NotNoneType另一個實例;)

+0

python語言規範是否也保證'True','False'或'Ellipsis'? (我的猜測:不是在python 2中,是在python 3中,基於能夠說'True = False')無論如何,這個保證是爲'None'做出的呢? –

+3

根據官方語言規範,「None」,「Ellipsis」和「NotImplemented」保證是單身。對於2.7.x和3.6.x都是如此:https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy https://docs.python.org/3.6/參考/ datamodel.html#的標準型的層次結構 –