【问题标题】:Python: how to get subclass's new attributes name in base class's method?Python:如何在基类的方法中获取子类的新属性名称?
【发布时间】:2011-08-21 03:32:19
【问题描述】:

我想将 SubClass 中的所有属性名称放到一个列表中,我想在 Base 类中执行此操作。我怎样才能做到这一点? 我现在的方法是:

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 = ''

有更好的方法吗?


感谢您的帮助。

【问题讨论】:

  • 你实际上想要完成什么?
  • 对不起,我已经编辑了这个问题。我想做一些像google的db api这样的类,当我定义db.Model类的新子类时,db.Model会知道子类的属性是数据库的列名。
  • 您不需要dir(self),而是dir(self.__class__),否则您将获得实例属性(例如在子类中定义的__init__),而不仅仅是类的属性。否则,您的版本与我的基本相同,我的版本更短一些(而且,有争议,更清晰,因为- 意味着不同,这就是您想要的)。
  • @JohnZ 的意思是什么为什么您认为您需要了解子类在基类中添加的属性。这没有任何意义——基类不应该知道任何关于子类的事情,真的。
  • 谢谢@agf,是的,你的方法是一样的,而且好多了,这就是我想要的。但是为什么在我的测试中, dir(self) == dir(self.__class__) 似乎总是正确的?它们都没有实例属性。

标签: python attributes subclass


【解决方案1】:

正如@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__。如果不这样做,您将获得不同的结果,具体取决于您检查新属性的时间

【讨论】:

  • 谢谢,非常感谢@agf,我看到了dir(self) 和dir(self.__class__) 的区别,不知道为什么它们以前看起来一样,但是这次他们是不同的。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多