2013-12-23 3 views
3

Я только что начал python, в java два разных экземпляра одного и того же типа имеют разные значения, но не позволяют им иметь разные атрибуты. Но,Почему python позволяет создавать разные атрибуты для одного класса?

class Point: 
    pass 

p1 = Point() 
p1.x = 0 
p1.y = 0 
p2 = Point() 
p2.z = 0 
p2.w = 1355135 

Этот код не вызывает ошибок. Поэтому я предполагаю, что это языковая функция. Но я не понимаю, почему python позволяет двум экземплярам одного типа иметь разные атрибуты?

Как это помогает при разработке кода?

+4

Какое «почему» вы ищете? Простой ответ: «потому что Python динамичен и почти все может быть изменено во время выполнения», в отличие от Java. – BrenBarn

+0

@BrenBarn проверить редактирование – Bhushan

+0

эй, где p1 определено в? :) – JoeC

ответ

5

Поскольку Python является динамическим языком. Объект Python в основном представляет собой dict (содержащий атрибуты экземпляра) + ссылку на базовые классы (которые тоже являются объектами) + пары крючков, ищущих атрибуты класса в базовых классах, когда они не существуют в dict экземпляра. FWIW вы можете даже изменить тип объекта во время выполнения, если хотите.

Как это помогает в разработке кода? Ну, имея возможность динамически добавлять/заменять произвольные атрибуты экземпляра и класса (в том числе методы) во время выполнения, значительно облегчает жизнь для каких-то проблем.

1

Поскольку Python является динамическим языком.

JavaScript, напр. будет делать то же самое
(не то, что JavaScript очень похож на Python).

«Как это помогает в разработке кода?»
Это позволяет программисту больше свободы, чем компилятор в статическом языке
язык забирает взамен некоторую безопасность или чувство безопасности.
Но это субъективно вообще, некоторые предпочитают статические языки,
другие предпочитают динамические.

1

Как это помогает при разработке кода?

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

Смежные вопросы