📜  __init_subclass__ 在Python中

📅  最后修改于: 2022-05-13 01:54:31.640000             🧑  作者: Mango

__init_subclass__ 在Python中

先决条件: Python类和对象, Python中的继承

无论任何编程语言,继承都是面向对象编程概念中最重要的主题之一。继承是根据另一个类定义一个类的概念。根据继承,我们知道超类引用可以保存其子类引用。我们都知道超类的行为可以根据其子类的实现而改变。

但是现在,我们可以通过使用__init_subclass__来改变子类的行为

__init_subclass__

# defining a SuperClass
class SuperClass:
  
     # defining __init_subclass__ method
    def __init_subclass__(cls, **kwargs):
        cls.default_name ="Inherited Class"
  
# defining a SubClass
class SubClass(SuperClass):
  
     # an attribute of SubClass
    default_name ="SubClass" 
    print(default_name)
  
subclass = SubClass()
print(subclass.default_name)

输出 :

SubClass
Inherited Class

理解代码

  • 在上面的例子中,有 2 个类(即 Super Class 和 SubClass),SubClass 继承自 SuperClass。 default_name是 SubClass 的一个属性。
  • 属性default_name的值由 SuperClass 使用__init_subclass__方法更改。
  • cls指的是继承的子类。给新类的关键字参数(**kwargs)被传递给父类__init_subclass__。
  • 为了与使用 __init_subclass__ 的其他子类兼容,应该取出所需的关键字参数并将其他关键字参数传递给基类(超类)。

这个__init_subclass__看起来很像装饰器类。但是在类装饰器只影响它们所应用的特定类的情况下, __init_subclass__只适用于定义该方法的类的未来子类。这意味着我们可以更改/定义从超类继承的任何新类的行为。
例子:

# defining a SuperClass
class SuperClass:
    def __init_subclass__(cls, default_name, **kwargs):
        cls.default_name = default_name
  
# defining a subclass
class SubClass1(SuperClass, default_name ="SubClass1"):
    pass
  
# defining another subclass
class SubClass2(SuperClass, default_name ="SubClass2"):
    default_name = "InheritedClass"
  
  
# references for subclasses
subClass1 = SubClass1()
subClass2 = SubClass2()
  
print(subClass1.default_name)
print(subClass2.default_name)

输出 :

SubClass1
SubClass2

由此我们可以得出结论,__init_subclass__ 方法用于改变将来可能创建的子类的行为。