我試圖使用Python的__new__
爲了在實例化類時返回與實際對象實例不同的東西(無論這是否巧妙是一個不同的討論)。下面是一個最簡單的例子,其中我返回了來自__new__
的兩個類實例的列表,而不是實際的類實例。無法創建新的對象實例重寫__new__
from copy import deepcopy
class TestClass:
def __new__(self, param=None):
self.__init__(self, param=param)
return [deepcopy(self), deepcopy(self)]
def __init__(self, param=None):
self.param = param
if __name__ == '__main__':
a = TestClass(param=1)
b = TestClass(param=2)
print(a[0].param) # prints 2!
然而,看來我不能用這種方法來創建實際的對象實例,因爲可以在最小的例子可以看出。 print
語句應打印1,但打印2,表示傳遞給第二次調用TestClass
的參數將覆蓋第一個調用的參數。我的猜測是a
和b
引用了同樣的static class TestClass,而我的deepcopy也沒有幫助,因爲它對靜態類沒有意義。
如何修改__new__
和__init__
TestClass
這樣我實際上創建了新的實例(即print語句應該打印1而不是2)?
(Python的3.5)
編輯/小澄:我其實不想TestClass的是靜態的(如果這是正確的行話反正),但我的非功能性的實現似乎產生像靜態類。
解決方案
感謝凱,下面的代碼工作:
class TestClass(object):
def __new__(cls, param):
instance1 = object.__new__(cls)
instance1.__init__(param)
instance2 = object.__new__(cls)
instance2.__init__(param)
return instance1, instance2
def __init__(self, param):
self.param = param
https://docs.python.org/3/reference/datamodel.html#object.__new__ –