2011-08-21 48 views
2

我想將所有的屬性名稱都放在一個列表中,我想在基類中做到這一點。我怎樣才能做到這一點? 現在我的方法是:Python:如何在基類的方法中獲取子類的新屬性名稱?

class Base(): 
    def __init__(self): 
     # print SubClass' new attribues' names ('aa' and 'bb' for example) 
     for attr in dir(self): 
      if not hasattr(Base, attr): 
       print attr 

class SubClass(Base): 
    aa = '' 
    bb = '' 

有沒有更好的方式來做到這一點?


感謝您的任何幫助。

+3

你想實現什麼目標? –

+0

對不起,我編輯了這個問題。我想創建一些像google的db api這樣的類,當我定義db.Model類的新子類時,db.Model會知道SubClass的屬性是數據庫的柱子名稱。 – walknotes

+1

你不需要'dir(self)'而是'dir(self .__ class __)',否則你會得到實例屬性(例如,在子類「__init__」中定義),而不僅僅是類的屬性。否則,你的版本與我的版本基本相同,我的版本稍微短一些(和可論證的更清晰,因爲'-'意思是差異,這就是你想要的)。 – agf

回答

2

正如@JohnZwinck在評論中所建議的那樣,如果您需要這樣做,您肯定會犯一個設計錯誤。但是,如果沒有更多信息,我們無法診斷問題。

這似乎做你想做的最簡單的方法:

class Base(object): 
    cc = '' # this won't get printed 
    def __init__(self): 
     # print SubClass' new attribues' names ('aa' and 'bb' for example) 
     print set(dir(self.__class__)) - set(dir(Base)) 

class SubClass(Base): 
    aa = '' 
    bb = '' 


foo = SubClass() 
# set(['aa', 'bb']) 

你需要self.__class__,而不是self,以測試新的屬性,原因是這樣的:

class Base(object): 
    cc = '' 
    def __init__(self): 
     print set(dir(self)) - set(dir(Base)) 
     # print SubClass' new attribues' names ('aa' and 'bb' for example) 

class SubClass(Base): 
    def __init__(self): 
     self.dd = '' 
     super(SubClass, self).__init__() 
    aa = '' 
    bb = '' 


foo = SubClass() 
# set(['aa', 'dd', 'bb']) 

如果你想在差在定義爲的類別之間,您需要使用__class__。如果你不這樣做,你將得到不同的結果,具體取決於何時檢查新屬性

+0

謝謝,非常感謝@agf,我已經看到了dir(self)和dir(self____ class__)之間的區別,我不知道他們之前爲什麼看起來相同,但是這次他們是不同的。再次感謝。 – walknotes

相關問題