2011-04-19 157 views
0

我想初始化一個類,然後調用初始化期間設置的屬性,但不創建另一個實例。作爲測試示例:在不創建實例的情況下調用類屬性

class t1: 
    def __init__(self, skipInit=False): 
     if not skipInit: 
      print 'Initialized' 
      self.var = 123456 
     else: 
      print 'Not Initialized' 

    def returnVar(self): 
     return self.var 

class t2: 
    def getVar(self): 
     print t1.returnVar(t1) 

我想t1()初始化T1,後來,從T2訪問VAR,與t2.getVar(t2)或T2內的一些其他方式。很明顯,上面的代碼不起作用,我很難理解爲什麼。

實際上這些類都在wxPython程序中。有一個框架 - >筆記本 - >面板 - >菜單欄層次結構,全部在單獨的文件中。在Panel初始化期間,我設置了許多變量,並嘗試從GUI上的某個菜單項訪問這些變量。此時面板將被初始化並顯示,這就是我添加skipInit開關的原因。任何想法如何做到這一點?

+0

那麼,這沒有多大意義。你是否知道類和實例之間的區別? 'self.var'是一個實例屬性,不創建它有時會打敗一個類的目的。也許一個具體的例子會更好地解釋你想要的東西。看來你可以只寫一個函數來完成初始化,你只需要調用它一次... – 2011-04-19 22:03:39

+0

對不起,如果我不清楚。實例'self.var'必須在初始化過程中設置,稍後訪問時不需要再次初始化。總之,我不能修改上面的't1'。那麼如何在不初始化t1的情況下訪問實例't1.var'? – 2011-04-19 22:27:16

回答

2

沒有什麼叫t1.var,所以當然你不能訪問它。 vart1實例的屬性;它不存在於課堂上。既然你可以有任意數量的t1實例,也沒有辦法爲t2實例方法知道t1比如,它應該尋找屬性var在沒有你告訴它。您可以在實例化t2時執行此操作。

# t1 class is the same as yours 

class t2: 
    def __init__(self, t1): 
     self.t1 = t1 
    def getVar(self): 
     print self.t1.returnVar(t1) 

obj1 = t1() 
obj2 = t2(obj1) # give the t2 instance the t1 instance 

print obj2.getVar() 
+0

我明白了!非常感謝,特別是對於解釋。在實際的wx程序中,我最終命名了像上面的obj1這樣的實例,並將它們作爲參數傳遞給菜單欄的孩子。像魅力一樣工作。 – 2011-04-20 04:39:52

0

也許這就是你想要的?

class T1(object): # Subclassing object makes a new-style class 
    def __init__(self): 
     self.var = 123456 

t1 = T1() 
# t1 is now an instance of T1. This calls __init__ to set it up. 

print t1.var  # 123456 
+0

我希望...'print t1.var'必須在不同的類中,這會產生我的問題。另請參閱上面的我的評論。 – 2011-04-19 22:30:44

+0

@Murat:所以其他類需要引用你的't1'實例,而不是類(我稱之爲'T1')。 – 2011-04-19 22:45:26

2

如果我正確地理解了這個問題,那麼你只需要將你的t1的實例傳遞給t2的一個實例。

class t2: 
    def getVar(self, t1): 
     print t1.returnVar(t1) 

t1_instance = t1() 
t2_instance = t2() 

t2.getVar(t1_instance) 
相關問題