2011-03-07 69 views
0

編輯,因爲我是一個白癡。原本應該說班級。Python的繼承和範圍問題

我有一個做了這樣的代碼:

file1.py

class A(object): 
    def __init__(self): 
    stuff_here() 

class B(object): 
    def func(self): 
    self.a = A() 

file2.py

import file1 
class A(file1.A): 
    def __init__(self): 
    file1.A(self) 
    self.thing = other_thing 

class B(file1.B): 
    pass 

我想,當我實例file2.B()它使用file2.A()爲其成員a,而不是file1.A()

有沒有辦法做到這一點?我試着看看python範圍規則,但我誤解了它。

+3

也許'對象'應該是'class'。 – 2011-03-07 17:49:21

+3

您是否可以更具體地瞭解您正在嘗試構建的內容?那麼也許我們可以提出替代建議。 – Thomas 2011-03-07 17:51:17

+0

我正在擴展已經有一些類中有很多代碼的系統。我需要更改A類的一個微小實現細節,因爲原始類會做出對我的數據不適用的假設。 – PGM 2011-03-07 18:03:08

回答

1

您可以使用class屬性來容納您想要使用的類。在第一個文件,使用

class B(object): 
    A = A 
    def func(self): 
     self.a = self.A() 

,並在第二個文件,使用

class B(file1.B): 
    A = A 

有可能是任何你想要達到實現一個更好的辦法...

編輯 :您對您的問題的評論意味着您不想實際更改第一個文件中的代碼。在這種情況下,您可以嘗試「猴子補丁」file1.py。寫​​作爲

import file1 

class A(file1.A): 
    def __init__(self): 
     file1.A(self) 
     self.thing = other_thing 

file1.A = A 

現在,你實際上是由你自己的版本取代file1.A。這當然很難做,但有時候是最快捷的方式。

+0

+1但有保留。雖然它應該做OP的要求,但我不禁感受到OP的真正努力要完成的任何其他方式都可以更好地完成。 – Davy8 2011-03-07 17:57:34

+0

這當然有效,但它確實感覺像一個黑客。我至少可以繼續前進,直到找出更優雅的東西。非常感謝。 – PGM 2011-03-07 18:20:54

0

在父項中定義一個方法,該方法返回要使用的類,並在子項中覆蓋它。