python - 我应该害怕 __init_subclass__ 开始的方式吗?

标签 python class initialization subclass enumerable

我在一个项目中使用 init_subclass ,当我遇到内置方法时有点犹豫,当代码第一次在解释器中运行时启动——没有通过实例化直接引用包含类或它枚举的子类。

谁能告诉我这是怎么回事,并指出任何安全使用的例子?

class Timer():

    def __init__(self):
        pass

    def __init_subclass__(cls):
        print('Runner.', cls)
        print('Timer Dictionary :', Timer.__dict__.keys())
        # print(Timer.__init_subclass__()) # Forbidden fruit...
        pass

class Event(Timer):
    print("I'll take my own bathroom selfies...thanks anyway.")

    def __init__(self):
        print('This is nice, meeting on a real date.')

if __name__ == '__main__': # a good place for a breakpoint
        date = Event()
        date

编辑-------------------------------------------- ----

根据收到的解释,将原始代码重组为有用的东西。

class Timer():

    subclasses = {}

    def __init__(self):
        pass

    def __init_subclass__(cls, **kwargs):
        print('Runner.', cls)
        print('Timer Dictionary :', Timer.__dict__.keys())
        # print(Timer.__init_subclass__()) # Forbidden fruit...
        super().__init_subclass__(**kwargs)
        cls.subclasses[cls] = []


class Event(Timer):
    print("I'll take my own bathroom selfies...thanks anyway.")

    def __init__(self):
        print('This is nice, meeting on a real date.')
        if self.__class__ in super().subclasses:
            # get the index and link the two
            super().subclasses[self.__class__].append(self)

if __name__ == '__main__': # a good place for a breakpoint
    date = Event()
    date
    duty = Event()
    duty
    print(Timer.subclasses)

最佳答案

这是一个最小的例子:

class Super():
    def __init_subclass__(cls):
        print(cls)

class Sub(Super):
    pass

运行这个:

$ python test.py
<class '__main__.Sub'>

这是为什么呢?根据Python's data model docs :

Whenever a class inherits from another class, init_subclass is called on that class.

Sub 继承自 Super,因此 Super.__init_subclass__() 被调用。

具体来说,type_new() invokes init_subclasscpython 实现中。

基本原理详见 PEP 487 .

关于python - 我应该害怕 __init_subclass__ 开始的方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51660663/

相关文章:

c++ - 在结构中初始化数组

java - 如何在 Java 中仅初始化一次局部变量

c++ - 使用OpenCV和python的人脸识别示例

java - 加载类,生成该类的对象

string - Fortran:在主程序中初始化长度未知的字符串

java - Generic 的实例作为方法参数

python - 如何在 Python 中找到继承变量的来源?

python - Flask 应用单元测试期间无法创建测试客户端

Python/Pandas - DataFrame 索引 - 向前移动一个月

python - 如何使用 Python 从文本文件中删除回车符?