我终于升级了我的 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'
我知道这种方法被称为子类定义后的after, 但我的问题特别关注于此功能的使用。我也阅读了PEP 487文章,但并没有对我有所帮助。这种方法在哪里会有用呢?是针对:
- 超类在创建时注册子类?
- 强制子类在定义时设置字段?
此外,我需要理解__set_name__
来充分理解它的使用吗?
GenericGitRepository
类的定义中,你是否遗漏了name
属性?非常棒的示例,我喜欢它。 - Julian Camilleriname
参数是可选的。 - Martijn Pietersname
为None
时,cls._registry[scm_type][name] = cls
- 我是否错过了某种机制? - Julian Camilleri