#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. Это довольно умно!