我终于升级我的Python版本,我发现新功能的加入。除此之外,我正在摸索新的__init_subclass__
方法。从文档:了解__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__
才能完全理解其用法?
我没有处理元类要充分理解它的用法,但要感谢你的解释(和其他人),看起来有很多情况需要“完成”声明后的子类的定义。 – EsotericVoid