Нет, это две разные вещи.
В Python все является объектом. Классы - это объекты, функции - это объекты, а экземпляры - это объекты. Поскольку все является объектом, все ведет себя аналогичным образом. В вашем случае вы создаете экземпляр класса (== объект с типом «Class») с именем «pytest». Этот объект имеет два атрибута: i
и fuc
. i
является экземпляром "Integer" или "Number", fuc
является экземпляром "Function".
Когда вы используете "pytest.j", вы говорите python "искать объект pytest
, а когда он у вас есть, искать i
". «pytest» является экземпляром класса, но это не имеет значения.
Когда вы создаете экземпляр «pytest» (== объект с типом «pytest»), то у вас есть объект, который имеет «значения по умолчанию». В вашем случае a
является экземпляром pytest
, что означает, что все, что не может быть найдено в a
, будет найдено в pytest
, затем.
То есть a.j
означает: «Посмотрите на a
. Когда его нет, посмотрите также на pytest
». Но j
не существует, и теперь Python должен дать вам значимое сообщение об ошибке. Можно сказать, что «у класса pytest нет атрибута« j »». Это было бы правильно, но бессмысленно: вам нужно было бы понять, что вы пытались получить доступ к j
через a
. Это было бы сбивающим с толку. У Гвидо этого не будет.
Следовательно, python использует другое сообщение об ошибке. Поскольку у него не всегда есть имя экземпляра (a
), разработчики решили использовать тип вместо этого, поэтому вы получите «экземпляр pytest ...».