Python:如何在基类的方法中获取子类的新属性名称?

Python:如何在基类的方法中获取子类的新属性名称?

问题描述:

我想将所有的属性名称都放在一个列表中,我想在基类中做到这一点。我怎样才能做到这一点? 现在我的方法是: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

正如@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