2016-07-02 61 views
-4

我想要一個類的局部變量被其他類改變。我的腳本類似於以下內容:新手調試Python代碼

import datetime 
b = [] 


class P: 
    def __init__(self): 
     self.count = 1 
     self.create() 

    def create(self): 
     global b 
     a = C(self.count) 
     for i in range(10): 
      a.print_name() 
     print b 


class C: 
    def __init__(self, *data): 
     self.test = data[0] 

    @staticmethod 
    def print_name(): 
     global b 
     b.append(datetime.datetime.now()) 
o = P() 

如何避免使用全局變量。在網上我發現使用「超級」可以解決問題。請幫助這方面。

回答

0

使C構造函數接受P實例。然後調用P的方法將項添加到P對象的實例屬性。

class P: 
    def __init__(self): 
     self.count = 1 
     self.items = [] 
     self.create() 

    def append(self, item): 
     self.items.append(item) 

    def create(self): 
     a = C(self, self.count) # <-- Pass P instance (self) 
     for i in range(10): 
      a.print_name() 
     print self.items 


class C: 
    def __init__(self, p_instance, *data): 
     self.p_instance = p_instance # <-- Save P instance to use later 
     self.test = data[0] 

    def print_name(self): 
     self.p_instance.append(datetime.datetime.now()) # <-- Call p instance method 
0

您可能正在尋找一個class屬性。如果將b作爲屬性添加到C類中,則可以將其作爲C.bC().b進行訪問,即從對類或任何實例的引用中進行訪問。

class C(object): # classes in py2 should inherit from object! 
    b = [] # b inside C definition 

    @classmethod 
    def print_name(cls): 
     cls.b.append(datetime.datetime.now()) 

class P(object): 
    def __init__(self): 
    self.count = 1 
    self.create() 

    def create(self): 
    a = C(self.count) 
    for i in range(10): 
     a.print_name() 
    print C.b # or a.b 

當然,你也可以將bP。在這種情況下,做

def print_name(): 
     P.b.append(datetime.datetime.now())