python определяет, какие свойства принадлежат дочернему классу

#python #class #python-3.x

#python #класс #python-3.x

Вопрос:

У меня есть иерархия классов python следующим образом:

 class A:
    def __init__(self):
        self.a = 1
        self.b = 2

class B(A):
    def __init__(self):
        super(B, self).__init__()
        self.c = 3
  

Теперь, когда я делаю что-то вроде:

 obj = B()
obj.__dict__
  

Я получаю:

 {'a': 1, 'b': 2, 'c': 3}
  

можно ли определить, какие из этих свойств принадлежат родительскому классу или, скорее, какие из этих свойств принадлежат только дочернему классу?

Комментарии:

1. Я не уверен, что то, о чем вы просите, четко определено в Python. Атрибуты «принадлежат» экземпляру, а не какому-либо из классов. У вас может быть код, A который изменяет self.c или код, B который изменяет self.a или self.b (последнее было бы нормальным, первое было бы немного странным, хотя и не незаконным).

Ответ №1:

Для вашего простого примера вы можете получить разницу в элементах dict:

 print(obj.__dict__.items() - A().__dict__.items())
  

Я полагаю, мы должны хотя бы обратиться к нему, не зная имени родительского класса:

  print(obj.__dict__.items() - obj.__class__.__bases__[0]().__dict__.items())
  

Комментарии:

1. Это остроумно 🙂 😉

2. Я бы добавил предостережение, которое вы дали в комментарии, что-то вроде того, что это не совсем точно определено в Python, поскольку атрибуты принадлежат экземпляру.

3. @juanpa.arrivillaga, на самом деле это был комментарий Blckknight, поэтому я не хотел бы принимать их слова. Я думаю, что OP, возможно, не совсем правильно сформулировал вопрос и имел в виду, что больше похоже на то, чтобы посмотреть, какие атрибуты наследуются по сравнению с установленными в дочернем классе, иначе это действительно не складывается.

4. @PadraicCunningham упс! Вы правы! Должно быть, я видел ваш дескриптор из редактирования.

5. Это довольно умно!