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

标签 python attributes subclass

我想将 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 = ''

有没有更好的方法来做到这一点?

谢谢你的帮助。

最佳答案

正如@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__ .如果你不这样做,你会得到 不同的结果取决于您检查新属性的时间 .

关于Python:如何在基类的方法中获取子类的新属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7136154/

相关文章:

python - 从分隔的行创建列表

Python:为什么具有两个参数的未绑定(bind)方法的行为不同于类方法?

python - Django 。 get_profile() 不起作用

Python 从属性移动到他的类

javascript - 使用 lodash 查找 null 属性

子类化 UIView 时,Swift 过渡动画不起作用

python - 如何绘制 4D 图的表面?

java - 具有额外属性的子类构造函数

interface - 使用在父类(super class)中定义的同名 var 覆盖在接口(interface)中定义的 val

Python::父类(super class)中的属性在继承子类中不可用