(! Эй, ребята, это может быть длинное описание, пожалуйста, немного терпения, спасибо)питон - Доступ к атрибуту класса суперкласса в супер() .__ INIT __()
У меня есть класс Parent
со многими свойствами, например, и я всегда передаю dict
для инициализации экземпляра. Как это:
info = {
"name" : "Bob",
"col" : 5,
"line" : 10,
"type" : "Alien"
}
p = Parent(info)
И в __init__
метод, который я не хочу писать this.property_name = value
для каждого свойства Потому что код будет очень долго. Например:
class Parent(object):
def __init__(self, kwargs):
this.name = kwargs.get("name")
this.col = kwargs.get("col")
this.line = kwargs.get("line")
this.type = kwargs.get("type")
Так что я хочу использовать функцию итерировать dict
, чтобы установить эти свойства экземпляра. Это функция, я писал:
def initialize_properties(instance, names, kwargs):
for name in names:
setattr(instance, name, kwargs.get(name))
Кажется, что мне нужно, чтобы сохранить список имен свойств names
где-то, и я решил сохранить его в качестве атрибута класса, потому что я хочу, чтобы мой класс был люди дружелюбный (когда кто-то читает определение класса, он знает, какие свойства экземпляра имеет этот класс). Поэтому я изменил определение своего класса следующим образом:
class Parent(object):
props = ("name", "col", "line", "type")
def __init__(self, kwargs):
initialize_properties(self, self.props, kwargs)
Это прекрасно работает, когда наследование НЕ рассматривается. Проблема возникает, когда я подкласс Parent
:.
class Child(Parent):
props = ("foo", "bar")
def __init__(self, kwargs):
super().__init__(kwargs)
initialize_properties(self, self.props, kwargs)
Я хочу случаи Child
наследовать все свойства экземпляра в суперкласса Parent
, с некоторыми свойствами экземпляра ребенка конкретным, а также (Вот почему мы используем наследование, ISN» t it?) Поэтому я переписываю атрибут класса props
для определения свойств, специфичных для ребенка.
Но это не работает.
info = {
"name" : "Bob",
"col" : 5,
"line" : 10,
"type" : "Alien",
"foo" : 5,
"bar" : 10
}
c = Child(info)
Instance c
имеет только c.foo
и c.bar
определены и установлены, в то время как c.name
не определен.
После некоторого копания я обнаружил, что, когда Parent.__init__(self, kwargs)
вызывается через функцию super()
, то self
переданный аргумент класса Child
, поэтому self.props
вычисляет Child.props
.
Если я хочу, чтобы установить свойство экземпляра в Parent.props
, я должен явно использовать Parent.props
в Parent.__init__(self, kwargs)
, что:
class Parent(object):
props = ("name", "col", "line", "type")
def __init__(self, kwargs):
initialize_properties(self, Parent.props, kwargs)
Это позволит решить эту проблему, но я думаю, что это не очень «чистый», потому что вам нужно жестко закодировать имя класса Parent
.
Так что мой вопрос: есть ли способ для определить текущий класс и получить доступ к его атрибутам класса, когда вы вызываете цепочку из super().__init__()
для инициализации экземпляра подкласса?
Это похоже на большую работу, чтобы избежать «this.property_name = value» для каждого свойства, потому что код будет очень длинным »... –