我应该担心__init_subclass__开始的方式吗?

时间:2018-08-02 19:11:45

标签: 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)

1 个答案:

答案 0 :(得分:3)

这是一个最小的例子:

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

class Sub(Super):
    pass

运行此:

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

那是为什么?根据{{​​3}}:

  

只要一个类继承自另一个类,就会在该类上调用 init_subclass

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

具体来说,是type_new()实现中的cpython Python's data model docs

invokes init_subclass中详细介绍了原理。