有沒有辦法繞過Python的類的構造函數__init__
?有沒有辦法在不調用__init__的情況下實例化一個類?
例子:
class A(object):
def __init__(self):
print "FAILURE"
def Print(self):
print "YEHAA"
現在我想創造的A
一個實例。它可能看起來像這樣,但是這個語法是不正確的。
a = A
a.Print()
編輯:
一個更復雜的例子:
假設我有一個對象C
,它是存儲一個單一的參數並執行一些計算與它其中的目的。然而,該參數並不是這樣傳遞的,而是嵌入在一個巨大的參數文件中。它可能是這個樣子:
class C(object):
def __init__(self, ParameterFile):
self._Parameter = self._ExtractParamterFile(ParameterFile)
def _ExtractParamterFile(self, ParameterFile):
#does some complex magic to extract the right parameter
return the_extracted_parameter
現在我想轉儲和裝載該對象C
的一個實例。但是,當我加載這個對象時,我只有一個變量self._Parameter
,我無法調用構造函數,因爲它期望參數文件。
@staticmethod
def Load(file):
f = open(file, "rb")
oldObject = pickle.load(f)
f.close()
#somehow create newObject without calling __init__
newObject._Parameter = oldObject._Parameter
return newObject
換句話說,無法在不傳遞參數文件的情況下創建實例。然而,在我的「真實」情況下,它不是一個參數文件,而是一些我不想在內存中攜帶的大量數據,或者甚至將它存儲到光盤中。
而且,因爲我想從方法Load
返回一個C
的實例,我不知何故必須調用構造函數。
OLD編輯:
更復雜的例子,這也解釋了爲什麼我問了一個問題:
class B(object):
def __init__(self, name, data):
self._Name = name
#do something with data, but do NOT save data in a variable
@staticmethod
def Load(self, file, newName):
f = open(file, "rb")
s = pickle.load(f)
f.close()
newS = B(???)
newS._Name = newName
return newS
正如你所看到的,因爲data
不存儲在一個類變量我不能傳遞給__init__
。當然,我可以簡單地存儲它,但如果數據是一個巨大的對象,我不想隨身攜帶,甚至將它保存到光盤中呢?
你到底想做什麼? – 2011-06-17 09:38:27
奇怪的問題....究竟是在做什麼? – 2011-06-17 09:39:57
我有一個「unpickled」的對象,我想從中創建一個相同類型的新對象。但是,從這個不帶鉤的對象中,我沒有足夠的數據供給__init__。在C++中,我會重載構造函數並使其變爲私有,在Python中,我迷路了^^。但__init__中的當前參數非常合理。這是我的困境。 – Woltan 2011-06-17 09:42:16