и посмотреть медиа
Код на салфетке - Python кодинг
и посмотреть медиа
Канал о программировании на Python и других языках. Простые объяснения и коды.
Канал о программировании на Python и других языках. Простые объяснения и коды.
AI бот для озвучки текста и клонирования голоса в Telegram. Создавай аудио с помощью нейросети быстро и просто.
Ресурс для интересующихся программированием. Фокус на Python, но охватывает и другие темы. Простые примеры и разборы.
Знаете ли вы, что у объекта нет методов? Методы не хранятся в самом объекте – они хранятся в классе. Обычно у инстанса есть свой __dict__, и при создании он пустой. Когда Python читает obj.x, он ищет по цепочке: сначала в obj.__dict__, потом в __dict__ класса, потом выше по наследованию. Методы находятся на втором шаге – поэтому кажется, что они принадлежат объекту, хотя на самом деле нет. class User: role = "viewer" def greet(self): return f"Hello, {self.role}" u = User() print(u.__dict__) # {} — инстанс пустой print("greet" in u.__dict__) # False — метода здесь нет print("role" in User.__dict__) # True — атрибут класса здесь print("greet" in User.__dict__) # True — метод тоже здесь greet и role определены в классе – там они и лежат. Инстанс u создан пустым: u.__dict__ не содержит ничего, пока не присвоить атрибут явно через u.x = .... Из этого следует кое-что интересное: атрибут, записанный напрямую в __dict__ инстанса, перекрывает обычный одноименный атрибут класса. class User: role = "viewer" u = User() print(u.role) # viewer — Python нашел в User.__dict__ u.__dict__["role"] = "admin" print(u.role) # admin — инстанс перекрыл класс del u.__dict__["role"] print(u.role) # viewer — снова из класса Порядок поиска такой: u.__dict__ -> User.__dict__ -> выше по цепочке. Как только нашел – возвращает. Поэтому запись в __dict__ инстанса как бы затмевает атрибут класса, не удаляя его. class BaseUser: active = True class User(BaseUser): role = "viewer" u = User() print(u.active) # True — нашел в BaseUser.__dict__, прошел всю цепочку u.__dict__["active"] = False print(u.active) # False — инстанс перекрыл print(BaseUser.active) # True — BaseUser.__dict__ не тронут Это стандартный механизм – на нем работают instance variables, которые пишутся через self.x = ... в __init__. Каждый раз это просто запись в obj.__dict__. Но это не вся история. Когда Python находит объект в User.__dict__ – он не всегда возвращает его напрямую. Если у найденного объекта есть метод __get__, Python вызывает его. Именно поэтому u.greet и User.greet возвращают разные вещи – об этом поговорим на следующей неделе. Код на салфетке x Кусочки кода
Открыть канал и посмотреть медиаТолько зарегистрированные пользователи могут делиться своим мнением.
Станьте первым, кто поделится своим впечатлением об этом ресурсе!