Это означает, что вы пытаетесь получить доступ к индексу массива, который недопустим, поскольку он не находится между границами.
Например, это инициализировало бы примитивный целочисленный массив с верхней границей 4 .
int intArray[] = new int[5];
Программисты подсчитываются с нуля. Таким образом, это, например, выбрало бы ArrayIndexOutOfBoundsException
, поскольку верхняя граница равна 4, а не 5.
intArray[5];
Подклассы никогда не имеют атрибутов своих суперклассов в качестве их атрибутов, независимо от того, методы или нет.
class Subclass(Super):
dictionary = Super.dictionary
dictionary.update({zero:0})
Подклассы имеют атрибуты своих суперклассов как свои атрибуты. Вы не можете использовать 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}
blockquote>, который, я думаю, соответствует вашим требованиям.
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
В 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
.
> Also remember that Python never implicitely copy anything, so the code below: > WILL update Parent.attr.
У меня было много сомнений!
– Claudiu
13 July 2018 в 12:24
class
. – bruno desthuilliers 13 July 2018 в 11:58>>> 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:01Object.__getattribute__()
поднимается на MRO.foo
по-прежнему не является частьюD
. – Ignacio Vazquez-Abrams 13 July 2018 в 12:19