Рубрики
Без рубрики

Статические и динамические атрибуты в Python – Какая разница?

Быстрый ответ: статические атрибуты являются переменными, определенными один раз для класса и совместно используются всеми экземплярами. Динамические атрибуты являются переменными, определенными только для индивидуальных экземпляров. Статические переменные используются в качестве «падения», когда нет явных динамических атрибутов, определенных для экземпляров. Когда вы пытаетесь «перезаписать» статический атрибут, такой как X.attr … Статические и динамические атрибуты в Python – в чем разница? Подробнее “

Автор оригинала: Chris.

Быстрый ответ : Статические атрибуты являются переменными, определенными один раз для класса и совместно используются всеми случаями. Динамические атрибуты являются переменными, определенными только для индивидуальных экземпляров. Статические переменные используются в качестве «падения», когда нет явных динамических атрибутов, определенных для экземпляров. Когда вы пытаетесь «перезаписать» статический атрибут, такой как x.attr , вы фактически создаете динамический атрибут на этом экземпляре, который живет отдельно от любого статического атрибута X.attr для класса X .

Вы только что наткнулись на условия «Статические атрибуты» и «Динамические атрибуты» и подумал, что они значат – и что такое Разница между ними в любом случае? Эта статья решит этот вопрос один раз и для всех. Итак, давайте начнем!

Вы также можете посмотреть мое видеочтенное видео, как вы прочитали оставшуюся статью:

Статические и динамические атрибуты в Python – Какая разница?

Изучая этот вопрос, вы улучшите ваше понимание объектно-ориентированного программирования. Итак, давайте нарушим этот вопрос на два простых:

  • Что такое статические атрибуты?
  • Что такое динамические атрибуты?

Какие статические атрибуты в Python?

💡 Статические атрибуты являются переменными, связанными с данным классом и поделились между всеми случаями. Если вы измените значение статического атрибута, все экземпляры увидят это изменение. Думать о них как Общие переменные Отказ

Вот простой пример:

class Book:
    # static attribute / class attribute
    classification = "textual"

coffee_break_python = Book()
hitchhikers_guide = Book()

print(Book.classification)
# textual
print(coffee_break_python.classification)
# textual
print(hitchhikers_guide.classification)
# textual

В коде мы определяем статический атрибут Классификация для класса Книга Отказ Вы можете получить доступ к этому атрибуту не только через имя класса Книга Но также через экземпляры Coffee_break_Python. и Titchhikeers Guide Отказ

Подумайте об этом таким образом: переменные экземпляра не имеют своего собственного атрибута классификация . Поэтому переводчик пытается исправить это, глядя вверх классовой иерархией, чтобы найти первое определение запрошенного атрибута классификация . Затем он находит атрибут на уровне класса.

💡 Почему они называют «статическими» в объектной ориентации? Поскольку они выделяются в памяти «статически» для всего пробега программы – даже до того, как первый объект когда-либо создан.

Хорошо, теперь вы готовы решить быструю головоломку, предполагая выше определения:

## Puzzle 1
Book.classification = "video"
print(hitchhikers_guide.classification)

Какой вывод этой головоломки? Обязаться к ответу сначала перед чтением.

Скорее всего, вы нашли правильный ответ. Фрагмент кода меняет значение атрибута класса. Экземпляр класса hitchhikers_guide не имеет своего собственного определения классификация Так что он дает определение от атрибута класса. Результат, следовательно, видео .

Давайте посмотрим на эту головоломку:

## Puzzle 2
Book.classification = "text"
hitchhikers_guide.classification = "audio"
print(coffee_break_python.classification)

Что сейчас вывод? Заблокируйте свой ответ в первую очередь, прежде чем читать. Иметь это? Хорошо, тогда давайте посмотрим, догадались ли вы правильно.

Что здесь происходит?

  • У вас есть атрибут статического класса.
  • Вы меняете его на уровне экземпляра (на «AUDIO»).
  • Вы печатаете атрибут класса, вызвав его через другой экземпляр.

Следовательно, результат является аудио . Верно?

Неправильный!

Результатом является текст . Так почему же?

Чтобы понять это, вы должны понять концепцию «Динамические атрибуты» первый.

Что такое динамические атрибуты в Python?

💡 Динамические атрибуты В Python атрибуты видны только на уровне экземпляра. Вы устанавливаете их динамически во время выполнения, то есть после создания экземпляров. В Python все является объектом (даже функциями). Таким образом, вы можете определить атрибут динамического экземпляра почти всего.

Теперь вы можете решить следующую головоломку?

## Puzzle 3
class Universe:
    None

def answer():
    return 42

u = Universe()
u.answer = 21
answer.answer = 21

print(answer.answer + u.answer == answer())

Какой вывод этого кода головоломка?

Смущает, я знаю. Но посвятить свой «ответ» в первую очередь.

В головоломке мы создаем два объекта: Вселенная Объект, назначенный на имя U и объект функции, назначенный имени Ответ Отказ

(Давайте не будем спорить (на данный момент), является ли класс объектом, а также …;))

Для обоих объектов мы создаем Динамический атрибут Ответ Отказ

💡  Разница в статическом атрибуте заключается в том, что мы определяем его во время выполнения для самих объектов, а не статически для класса.

Это ответ на вопрос, адресованный в этой статье.

Класс Вселенная И все остальные потенциальные экземпляры этого класса не знают атрибута отвечать . Он определяется только для экземпляра U и экземпляр Ответ Отказ Вот и все.

Кстати: результат для головоломки 3 это Правда Отказ

Но более важно, теперь мы можем понять, почему головоломка 2 производит результат Аудио И не текст :

Book.classification = "text"
hitchhikers_guide.classification = "audio"
print(coffee_break_python.classification)

Первая строка говорит о статическом атрибуте класса. Это атрибут по умолчанию, если экземпляр не определил свой собственный атрибут.

Вторая строка разговаривает о динамическом атрибуте экземпляра Titchhikeers Guide Отказ Это только определено для этого экземпляра. Так что книга Coffee_break_python , Не стесняйтесь узнать больше о Кофе-брейк Python Серия здесь , ничего не знает о динамическом атрибуте другой книги. Это только знает о статическом атрибуте из Книга класс.

Резюме

Подводя итог, вы узнали о Разница между статическими и динамическими атрибутами в Python Отказ Статические атрибуты определяются один раз для класса – и используются в качестве «падения» в случае, если нет явных динамических атрибутов, определенных для экземпляров. Как только вы пытаетесь «перезаписать» статический атрибут attr позвонив этому экземпляру х например, в x.attr , вы фактически создаете динамический атрибут на этом экземпляре, который живет отдельно от любого статического атрибута X.attr для класса X .

(Отказ от ответственности: я знаю, что термин «статический атрибут» не так распространен в Python, но я действительно нашел его довольно полезным, чтобы объяснить вещи.)

Куда пойти отсюда?

Вам нравится участвовать на основе головоломки Python? Я удваиваюсь на этот уникальный способ изучения Python, потому что «практическое тестирование» научно доказано, что является одним из самых эффективных методов обучения. Тем не менее, я не нашел какую-либо книгу Python на основе головоломки на рынке. Вот почему я написал Учебник Python «Phame Raw Proke Python», который основан на 100% на учебном настроении на основе головоломки. Получить книгу сейчас!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.

Оригинал: “https://blog.finxter.com/static-and-dynamic-attributes-in-python/”