Я наконец обновил свою версию Python и обнаружил добавленные новые функции. Среди прочего, я ломал голову над новым __init_subclass__
метод. Из документов:
Этот метод вызывается всякий раз, когда содержащий класс является подклассом. cls - это новый подкласс. Если он определен как обычный метод экземпляра, этот метод неявно преобразуется в метод класса.
Итак, я начал немного поиграться с этим, следуя примеру в документации:
class Philosopher:
def __init_subclass__(cls, default_name, **kwargs):
super().__init_subclass__(**kwargs)
print(f"Called __init_subclass({cls}, {default_name})")
cls.default_name = default_name
class AustralianPhilosopher(Philosopher, default_name="Bruce"):
pass
class GermanPhilosopher(Philosopher, default_name="Nietzsche"):
default_name = "Hegel"
print("Set name to Hegel")
Bruce = AustralianPhilosopher()
Mistery = GermanPhilosopher()
print(Bruce.default_name)
print(Mistery.default_name)
Производит этот вывод:
Called __init_subclass(<class '__main__.AustralianPhilosopher'>, 'Bruce')
'Set name to Hegel'
Called __init_subclass(<class '__main__.GermanPhilosopher'>, 'Nietzsche')
'Bruce'
'Nietzsche'
Я понимаю, что этот метод вызывается после определения подкласса, но мои вопросы касаются, в частности, использования этой функции. Я прочитал статью PEP 487 тоже, но мне это не сильно помогло. В чем может быть полезен этот метод? Это для:
- суперкласс для регистрации подклассов при создании?
- принуждение подкласса установить поле во время определения?
Кроме того, нужно ли мне понимать __set_name__
, чтобы полностью понять его использование?