2013-08-21 139 views
1

我有一個創建另一個Python類的實例,我想知道,如果「創造」類可以訪問的「創造者」的成員沒有將它們明確地,或做這樣的事情:另一個類實例創建的類實例是否可以訪問創建者的成員?

class Creator(object): 
    def __init__(self, parameter): 
     self.parameter = parameter 
     self.created = Created(self) 

class Created(object): 
    def __init__(self, creator): 
     self.creator = creator 
     self.parameter = self.creator.parameter 

我想我想要做的是允許parameter由兩個訪問,除了在實踐中會有多個參數,所以傳遞它們都會導致一長串參數。我現在的解決方案是使用Creator作爲Created的參數。有沒有一個更尷尬或更聰明的方式來做到這一點?也許把所有的參數放在字典中?

+2

作爲一個側面說明,'類造物主()'是一箇舊式的類,而不是新的風格,你幾乎永遠都不想。 (在極少數情況下,當你這樣做時,你應該把它寫成'class Creator:'。)總是做'class Creator(object):'來創建一個新式的類。 – abarnert

+0

尷尬的感覺暗示創建者/創建的引用可能不是解決您的問題的更好模式。更具體的例子可能有助於獲得更好的答案,例如,是否適用於遊戲? –

+0

你真的需要造物主成爲一個班級嗎?我認爲在你的情況下,一個簡單的工廠函數將工作得很好。 –

回答

3

你可以做到這一點,你已經差不多完成了,只有一個小問題:

class Created(): 
    def __init__(self, creator): 
     self.parameter = self.creator.parameter 

沒有self.creator。如果你永遠需要這種__init__調用後再次訪問,只需要使用直接creator參數:

class Created(): 
    def __init__(self, creator): 
     self.parameter = creator.parameter 

如果以後需要它,它存儲爲self.creator,然後當然也可以訪問它:

class Created(): 
    def __init__(self, creator): 
     self.creator = creator 
     self.parameter = self.creator.parameter 

...雖然在這種情況下您甚至可能不需要複製parameter,因爲您始終可以將它作爲self.creator.parameter

這是一種非常常見的模式。

唯一真正的缺點是如果你保持反向引用(self.creator = creator),你不能有任何__del__方法。 (或者你需要使它成爲weakref,或者是間接參考,就像可以用來根據需要查找創建者的鍵)。

0

恕我直言,它看起來很好。如果參數是一個類屬性而不是實例,你可以使用繼承,但我不認爲這是一個改進。

def creator_factory(param): 
    class Creator(object): 
     parameter = param 
    return Creator 

Creator = creator_factory(something) 

class Created(Creator): 
    pass 

>>> Created().parameter 
'something' 
+0

將一個實例屬性變成一個類屬性,並讓一個類從一個不相關的類繼承,這樣你就可以避免一次傳遞'self'? – abarnert

+0

你是對的,如果類是不相關的,創建者和創建者在層次結構中共享相同的屬性提示是沒有意義的(OP提供的例子太抽象了,無法確定)。 –

0

另一種選擇

class Creator(): 
    def __init__(self, parameter): 
     self.parameter = parameter 
     self.created = Created() 
     self.created.creator = self 
相關問題