2013-10-30 33 views
1
class Base: 
    def __init__(self): 
     self.x = 4 

class C1(Base): 
    ... 

class C2(Base): 
    ... 

obj1 = C1() 
obj2 = C2() 

obj1.x = 2 

我以「單身」明白如果我改變「self.x」 C1的它可以自動將該單一類的每個實例的更新「self.x」 .. 。但是我怎樣才能使用同一個基礎更新所有的類?Python的元編程更新A類每一次B類改變

+0

如果你在python中使用單例,你通常會做錯事。 – ThiefMaster

+0

你是某種形式的類的「靜態」變量之後: http://stackoverflow.com/questions/68645/static-class-variables-in-python – jozxyqk

回答

1

有人糾正我,如果我錯了,但是這很容易用一個簡單的reaaaal描述來解決這樣的例子:

class KeepSync(object): 
    def __init__(self, default): 
     self.value = default 
    def __get__(self, instance, owner): 
     return self.value 
    def __set__(self, instance, value): 
     self.value = value 

class Foo(object): 
    bar = KeepSync(0) 

class C1(Foo): 
    pass 

class C2(Foo): 
    pass 



f = C1() 
g = C2() 

print "f.bar is %s\ng.bar is %s" % (f.bar, g.bar) 
print "Setting f.bar to 10" 
f.bar = 10 
print "f.bar is %s\ng.bar is %s" % (f.bar, g.bar) # YAY BOTH ARE 10 ! 

繼承KeepSync描述符將始終返回值的任何對象,我不當然,如果我幫助,但是,這就是我理解問題的方法,你甚至不需要基類,但是你可以使用

0

你試圖做的事情是行不通的。雖然初始x = 4存儲在類中,而不是實例,但任何分配(如obj1.x = 2)都會將其存儲在實例中。

如果你真的想創建一個單例,(ab)使用一個元類來確保每個創建的實例都是相同的。有關示例,請參見this answer

+0

這個例子的問題是,它只更新同一類的所有實例。它不會更新obj2當我更改obj1中的「self.x」 – Wayne

+0

這是我在原始文章中提到的「單例」。 – Wayne

+0

哦,你想讓它忽略繼承。應該很容易更新元類,以使用基類作爲'_instances' dict的關鍵字而不是實際的類。 – ThiefMaster

1

移動X報關出的init:

class Base: 
    x = 4 

    def __init__(self): 

後來,當你需要設置它,請執行下列操作:

Base.x = 5 

你可以包裝成一個@staticmethod這使其更容易以及。

正如其他人所說,靜態變量是真的壞,你不應該使用它們,除非它是你的最後的手段。

相關問題