Python: как получить имя нового атрибута подкласса в методе базового класса? - PullRequest
2 голосов
/ 21 августа 2011

Я хочу поместить все имена атрибутов в подклассе в список, я хочу сделать это в базовом классе.Как я могу это сделать?Мой метод теперь таков:

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 Ответ

2 голосов
/ 21 августа 2011

Как подсказывает @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__. Если вы этого не сделаете, вы получите различные результаты в зависимости от того, когда вы проверяете наличие новых атрибутов .

...