Python 详解__init_subclass__类方法

2023-12-13 05:32:05
  • 类方法 __init_subclass__3.6whatsnew3.6) 引入,作用是可以在不使用元类的情况下改变子类的行为。也就是说它是独立于元类编程的,也能达到编辑其他类的一种手段。
  • 它在一个类被继承时自动调用。这个方法的主要作用是允许一个类在被继承时执行一些特定的操作,例如修改类的属性或方法。
  • __init_subclass__方法接收一个类作为参数,这个类就是继承自己的子类。除此之外,__init_subclass__还可以接收任意数量的关键字参数,这些参数在定义子类时传入。
class B(object):

    def __init_subclass__(cls, **kwargs):
        print("__init_subclass__", cls, kwargs)

class A(B, name="张三", age=16):
    pass

"""
代码运行直接输出下面的结果:
    __init_subclass__ <class '__main__.A'> {'name': '张三', 'age': 16}
"""
class A:
    def __init_subclass__(cls, **kwargs):
        """当有子类继承了 A ,那么 __init_subclass__ 就会自动调用。
        这里的逻辑是:父类 A 为它的所有子类都设置了 default_name 的类属性,且默认值是子类的类名。
        __init_subclass__方法解决了如何让父类知道自己被继承的问题。
        """
        cls.default_name = kwargs.get("default_name", cls.__name__)


class User(A, default_name="foo"):
    """User类继承了A类,那么A类的__init_subclass__方法就会自动调用。"""

    def __init__(self, name):
        self.name = name

    def say(self):
        print(f"i am {self.name}")

class B(A):
    pass

if __name__ == "__main__":
    f = User("bar")
    print(f)  # <__main__.User object at 0x100b60fa0>
    f.say()  # i am bar
    print(f.__dict__)  # {'name': 'bar'}
    print(User.default_name) # foo
    print(B.default_name) # B

文章来源:https://blog.csdn.net/JENREY/article/details/134895825
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。