Изменить схему именования атрибутов при использовании наследования - PullRequest
0 голосов
/ 20 марта 2020
class parent:
    def __init__(self, i,j):
        self.i = i
        self.j = j

class child(parent):
    def __init__(self,m,n):
        super().__init__(m,n)
    def func(self):
        print(self.m, self.n)

child(1,2).func()

Этот код показывает ошибку AttributeError: 'child' object has no attribute 'm'.

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

1 Ответ

1 голос
/ 21 марта 2020

Вы можете получить эффект от того, что вы хотите сделать, используя свойства. В приведенном ниже примере используется небольшая служебная функция с именем alias(), помогающая минимизировать повторяющийся код.

При использовании, как показано, он «перенаправляет» доступ к имени уровня класса, которому он назначен, и имени, переданного ему в качестве аргумента. Это означает, что m = alias('i') сделает m псевдонимом для i.

def alias(attrname):
    @property
    def prop(self):
        return getattr(self, attrname)

    @prop.setter
    def prop(self, value):
        setattr(self, attrname, value)

    return prop


class Parent:
    def __init__(self, i, j):
        self.i = i
        self.j = j

class Child(Parent):
    m = alias('i')
    n = alias('j')

    def func(self):
        print(self.m, self.n)


Child(1,2).func()  # -> 1 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...