👍1👎1
«class С:
def act(self):
print('spam')
class E(С):
def method(self): # self подразумевается в super
proxy = super() # Эта форма не имеет смысла вне метода
print(proxy) # Вывод обычно скрытого промежуточного объекта
proxy.act() # Аргументы отсутствуют: неявно вызывает метод суперкласса
print(E().method())»
Пошагово:
1. E().method() создает экземпляр класса E и вызывает его метод method()
2. Внутри method():
- Создается proxy = super() (объект super)
- Выводится print(proxy) → <super: <class 'E'>, <E object>>
- Вызывается proxy.act() → выводится spam
3. Метод method() завершается без return, поэтому возвращает None
👍1👎1
🧩 @classmethod преобразует функцию в:
Anonymous Quiz
13%
статический метод
11%
метод экземпляра
5%
абстрактный метод
71%
метод класса
👍1👎1🤡1
«
В данном случае преимущества такие:
- Гибкость - разные способы создания объектов
- Читаемость - from_string явно показывает источник
- Наследование - если создать подкласс, cls автоматически будет указывать на него
👍4👎1
👍1👎1
«В данном случае ветви дерева суперклассов разъединены (у них отсутствует явный общий предок), так что подклассы, которые их комбинируют, должны делать вызовы через каждый суперкласс по имени — распространенная ситуация с большинством существующего кода на Python, которую super не может решить напрямую без внесения изменений в код».
class В:
def __init__(self): print("B.__init__")
class С:
def __init__(self): print("C.__init__")
class D(В, С):
pass
x = D() # По умолчанию выполняется только крайний слева
👍1👎1
👍1👎1
Самый доступное объяснение этой концепции можно посмотреть на
👍1👎1
🧩 Что делает pd.options.mode.copy_on_write?
Anonymous Quiz
18%
Добавляет приставку df_ к названиям столбцов копии df
68%
Откладывает копирование датафрейма до изменения
4%
Отключает все проверки типов данных
10%
Такого в Pandas нет
👍1👎1
«В зависимости от результата операции мутация одного объекта может случайно привести к мутации другого:
df = pd.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]})
subset = df["foo"]
subset.iloc[0] = 100
df
В консоль выведется:
foo bar
0 100 4
1 2 5
2 3 6
Изменение подмножества, например, обновление его значений, также приводит к обновлению df. Точное поведение сложно предсказать. Copy-on-Write решает проблему случайного изменения более одного объекта, явно запрещая это. При включённом CoW df не изменяется».
Режим copy_on_write означает "копирование при записи". Это оптимизация, которая позволяет pandas не создавать копии данных сразу при создании view или slice, а только тогда, когда данные действительно изменяются. Это значительно экономит память, особенно при работе с большими наборами данных и цепочками операций. Это дефолтное поведение для Pandas версии 3.0+.
👍2👎1
👍2👎1
«Код вызовет ошибку:
TypeError: __init__() takes 2 positional arguments but 3 were given
Ошибка типа: __init__() принимает 2 позиционных аргумента, но было предоставлено 3.
Проблема связана с тем, что вызов super в Chef не обращается к своему суперклассу Employee, но взамен делает обращение к родственному классу того же уровня и следующему в MRO, т.е. Server. Поскольку конструктор родственного класса имеет список аргументов, отличающийся от списка аргументов в конструкторе настоящего суперкласса, который ожидает только self и name, код перестает работать».
👍2👎1😱1
👍2👎1
«Но обратите внимание, что происходит, когда мы изменяем атрибут класса динамически за пределами оператора class: в итоге также изменяется атрибут в каждом объекте, унаследованном от класса. Кроме того, новые экземпляры, созданные из класса в течение текущего сеанса или запуска программы, также получают динамически установленное значение
независимо от того, что указано в исходном коде класса.
...
Это полезная возможность или опасная ловушка? Судить вам. ... вы можете сделать работу за счет изменения атрибутов класса даже без создания одиночного экземпляра — методика, с помощью которой удастся эмулировать использование “записей” или “структур” в других языках. ...
class X: pass # Создать несколько пространств имен атрибутов
class Y: pass
X.а = 1 # Использовать атрибуты классов как переменные
X.b = 2 # Какие-либо экземпляры отсутствуют
X.с = 3
Y.a = X.а + X.b + X.с
for X.i in range (Y.a): print(X.i)
Код выведет:
1
2
3
4
5
Здесь классы X и Y работают подобно модулям «без файлов» — пространствам имен для хранения переменных, которые не должны конфликтовать. Это вполне законный трюк в программировании на Python, но он менее уместен, когда применяется к классам, реализованным другими; вы не всегда можете быть уверены в том, что изменяемые атрибуты отдельного класса не являются критически важными для его внутреннего поведения».
👍3👎1