我不敢肯定我明白你想要什麼,但是像這樣的可能就是吧。用這種技術你不能有一個__init__
,因爲如果你這樣做,它將被稱爲而不管是否__new__
返回一個新的對象。
class A(object):
def __new__(cls, obj):
if isinstance(obj, cls):
return obj
rv = object.__new__(cls)
# everything you would normally put in __init__
# goes here instead
rv._obj = obj
return rv
# for instance:
def __repr__(self):
return "A({})".format(repr(self._obj))
>>> A()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __new__() takes exactly 2 arguments (1 given)
>>> A(1)
A(1)
>>> A(A(1))
A(1)
不能夠使用__init__
是麻煩的,特別是如果你需要繼承A
。這裏有一個方法來解決是:
class A(object):
def __new__(cls, obj):
if isinstance(obj, cls):
return obj
rv = object.__new__(cls)
rv._initialized = False
return rv
def __init__(self, obj):
if self._initialized: return
self._obj = obj
self._initialized = True
class B(A):
def __init__(self, obj):
if self._initialized: return
A.__init__(self, obj)
self._otherthing = "foo"
你必須檢查self._initialized
在每個子類中的方法__init__
,很遺憾。
這看起來像一個裝飾者。 – 2rs2ts
我認爲你唯一的兩個選擇就是你提到的選項:類中的__new__或轉換方法。根據您的使用情況,可能'__new__'最有意義。 – Claudiu