_supported_versions = ['2.7', '3.4', '3.5', '3.6', '3.7']
python3.7 setup.py
pip install matlab_kernel
_PYTHONVERSION = '3_7'
Теперь вы можете запустить jupyter и выбрать ядро Matlab
То, что вы постоянно называете ошибкой, это задокументированное , стандартное поведение классов Python.
Объявление dict вне __ init __
, как вы это делали изначально, объявляет переменную уровня класса. Сначала он создается только один раз, всякий раз, когда вы создаете новые объекты, он будет повторно использовать тот же самый dict. Чтобы создать переменные экземпляра, вы объявляете их с помощью self
в __ init __
;
Когда вы обращаетесь к атрибуту экземпляра, скажем, self.foo, python сначала найдет 'foo' в self .__ dict __
. Если не найден, python найдет 'foo' в TheClass .__ dict __
В вашем случае dict1
относится к классу A, а не к экземпляру.
Если это ваш код:
class ClassA:
dict1 = {}
a = ClassA()
Тогда вы, вероятно, ожидали, что это произойдет внутри Python:
class ClassA:
__defaults__['dict1'] = {}
a = instance(ClassA)
# a bit of pseudo-code here:
for name, value in ClassA.__defaults__:
a.<name> = value
Насколько я могу судить, - это , что происходит, за исключением того, что в dict
скопирован указатель вместо значения, что является поведением по умолчанию в Python. Посмотрите на этот код:
a = {}
b = a
a['foo'] = 'bar'
print b
Объявления классов Pythons выполняются как блок кода, и любые определения локальных переменных (из которых определения функций являются особым видом) хранятся в созданном экземпляре класса. Из-за того, как поиск атрибутов работает в Python, если атрибут не найден в экземпляре, используется значение класса.
Это интересная статья о синтаксисе класса по истории Блог Python.
@Matthew: Пожалуйста, проверьте разницу между членом класса и членом объекта в объектно-ориентированном программировании. Эта проблема возникает из-за того, что объявление исходного dict делает его членом класса, а не членом объекта (как это было задумано исходным плакатом). Следовательно, он существует один раз для (совместно используется) всех экземпляров класса (т.е. один раз для самого класса, как члена самого объекта класса), поэтому поведение совершенно правильное.