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

5 投票
1 回答
7546 浏览
提问于 2025-04-17 00:01

我想把子类(SubClass)里的所有属性名称放到一个列表里,但我想在基类(Base class)里完成这个操作。我现在的方法是:

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

有没有更好的方法可以做到这一点呢?


谢谢大家的帮助。

1 个回答

5

正如@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__。如果不这样做,你会发现检查新属性的结果会因检查的时间不同而不同

撰写回答