Как наследовать и расширять атрибуты класса в Python

Это означает, что вы пытаетесь получить доступ к индексу массива, который недопустим, поскольку он не находится между границами.

Например, это инициализировало бы примитивный целочисленный массив с верхней границей 4 .

int intArray[] = new int[5];

Программисты подсчитываются с нуля. Таким образом, это, например, выбрало бы ArrayIndexOutOfBoundsException, поскольку верхняя граница равна 4, а не 5.

intArray[5];
2
задан atline 13 July 2018 в 14:18
поделиться

3 ответа

Подклассы никогда не имеют атрибутов своих суперклассов в качестве их атрибутов, независимо от того, методы или нет.

class Subclass(Super):
  dictionary = Super.dictionary
  dictionary.update({zero:0})
1
ответ дан Ignacio Vazquez-Abrams 17 August 2018 в 12:59
поделиться
  • 1
    Подклассы имеют свои атрибуты суперкласса (ну, атрибуты суперклассов доступны через подклассы, если точнее), но не в блоке оператора class. – bruno desthuilliers 13 July 2018 в 11:58
  • 2
    >>> class B: ... foo = 42 ... >>> class D(B): ... pass ... >>> B.__dict__ mappingproxy({'__module__': '__main__', 'foo': 42, '__dict__': <attribute '__dict__' of 'B' objects>, '__weakref__': <attribute '__weakref__' of 'B' objects>, '__doc__': None}) >>> D.__dict__ mappingproxy({'__module__': '__main__', '__doc__': None}) – Ignacio Vazquez-Abrams 13 July 2018 в 12:01
  • 3
    Вы прочитали часть в parens в моем комментарии? – bruno desthuilliers 13 July 2018 в 12:12
  • 4
    @brunodesthuilliers: Да, и это потому, что Object.__getattribute__() поднимается на MRO. foo по-прежнему не является частью D. – Ignacio Vazquez-Abrams 13 July 2018 в 12:19
  • 5
    Да, это то, что я сказал, и я знаю, как это работает (с использованием python с 1,5,2 дня и с некоторой потерей с объектной моделью Python). – bruno desthuilliers 13 July 2018 в 12:50

Подклассы имеют атрибуты своих суперклассов как свои атрибуты. Вы не можете использовать directionay.update({"zero":0}), потому что в это время class Subclass все еще не существует. Если вы не делаете line1 & amp; line2, вы все равно можете увидеть строку4 {'one':1, 'two':2}, подтверждающую ее.

Но если вы делаете line1 & amp; line2, вам нужно было добавить copy(), в противном случае вы увидите строку 3 и amp; line4 оба становятся {'zero': 0, 'two': 2, 'one': 1}, что означает, что вы хотите расширять параметры в подклассе, но вы также изменяете параметры в суперклассе, это не разумно.

Итак, следующий код будет просто выводиться:

< blockquote>

{'two': 2, 'one': 1}

{'zero': 0, 'two': 2, 'one': 1}

, который, я думаю, соответствует вашим требованиям.

class Super(object):
    dictionary = {'one':1, 'two':2}

    def __init__(self, var):
        self.var = var

    def supermethod(self):
        pass

class Subclass(Super):
    dictionary = Super.dictionary.copy() # line1
    dictionary.update({"zero":0}) # line2

    def __init__(self, var):
        super(Subclass, self).__init__(var)
        self.var = var

    def submethod(self):
        pass

print(Super.dictionary) # line3
print(Subclass.dictionary) # line4
1
ответ дан atline 17 August 2018 в 12:59
поделиться

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

IOW, в блоке оператора класса, объект class еще не существует и, как следствие, это нельзя ссылаться ни в явном виде (по имени класса), ни в неявно (Python слишком сильно опровергает явное по неявным).

OTHO, объект родительского класса существует в этой точке, очевидно (иначе вы не могли бы наследовать от он), поэтому вы можете явно ссылаться на него:

class Parent(object):
   attr = something()


class Child(Parent):
   attr = Parent.attr
   # do something with Parent.attr

Обратите внимание, что атрибуты, определенные в блоке операторов класса (здесь attr), являются «атрибутами класса», атрибутами IOW объекта class и как таковые разделяются между примерами. Когда этот атрибут является изменяемым объектом, мутация его из одного экземпляра будет влиять на все экземпляры.

Также помните, что Python никогда не копирует ничего, поэтому код ниже:

class Parent(object):
   attr = {"foo": "bar"}


class Child(Parent):
   attr = Parent.attr
   attr["baaz"] = "quux"
   # or attr.update(baaz="quux") etc

WILL обновить Parent.attr.

2
ответ дан heemayl 17 August 2018 в 12:59
поделиться
  • 1
    Спасибо. То, как вы объяснили, что: > Also remember that Python never implicitely copy anything, so the code below: > WILL update Parent.attr. У меня было много сомнений! – Claudiu 13 July 2018 в 12:24
Другие вопросы по тегам:

Похожие вопросы: