Членская инициализация класса Python

  • Перед установкой matlab_engin вы можете просто изменить файл setup.py . (вам следует изменить разрешение этого файла, например: chmod 777 setup.py) . Добавьте «3.7» в список поддерживаемых версий:
  • _supported_versions = ['2.7', '3.4', '3.5', '3.6', '3.7']
    
    • Установить в оболочку с помощью
    python3.7 setup.py
    
    • Также необходимо установить ядро ​​Matlab .
    pip install matlab_kernel
    
    • Затем в файле /usr/local/lib/python3.7/site-packages/matlab/engine / __ init __. Py заменить _PYTHONVERSION = нет с
    _PYTHONVERSION = '3_7'
    

    Теперь вы можете запустить jupyter и выбрать ядро ​​Matlab

41
задан Roee Adler 17 May 2009 в 03:30
поделиться

5 ответов

То, что вы постоянно называете ошибкой, это задокументированное , стандартное поведение классов Python.

Объявление dict вне __ init __ , как вы это делали изначально, объявляет переменную уровня класса. Сначала он создается только один раз, всякий раз, когда вы создаете новые объекты, он будет повторно использовать тот же самый dict. Чтобы создать переменные экземпляра, вы объявляете их с помощью self в __ init __ ;

53
ответ дан 27 November 2019 в 00:48
поделиться

Когда вы обращаетесь к атрибуту экземпляра, скажем, self.foo, python сначала найдет 'foo' в self .__ dict __ . Если не найден, python найдет 'foo' в TheClass .__ dict __

В вашем случае dict1 относится к классу A, а не к экземпляру.

2
ответ дан 27 November 2019 в 00:48
поделиться

Если это ваш код:

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
0
ответ дан 27 November 2019 в 00:48
поделиться

Объявления классов Pythons выполняются как блок кода, и любые определения локальных переменных (из которых определения функций являются особым видом) хранятся в созданном экземпляре класса. Из-за того, как поиск атрибутов работает в Python, если атрибут не найден в экземпляре, используется значение класса.

Это интересная статья о синтаксисе класса по истории Блог Python.

0
ответ дан 27 November 2019 в 00:48
поделиться

@Matthew: Пожалуйста, проверьте разницу между членом класса и членом объекта в объектно-ориентированном программировании. Эта проблема возникает из-за того, что объявление исходного dict делает его членом класса, а не членом объекта (как это было задумано исходным плакатом). Следовательно, он существует один раз для (совместно используется) всех экземпляров класса (т.е. один раз для самого класса, как члена самого объекта класса), поэтому поведение совершенно правильное.

2
ответ дан 27 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

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