python: 运行 __new__ 时出错?不调用 __init__

python: error when running __new__? not invoking __init__

我正在阅读 Python 有关继承和使用 __new____init__

的文档

https://docs.python.org/3/reference/datamodel.html#basic-customization

我正在尝试创建一个 class 'config',它将是一个通用的 class,具有我所有项目通用的所有基本方法

from abc import ABCMeta, abstractmethod

class MyConfig(metaclass=ABCMeta):
    def __new__(cls, *args, **kwargs):
        print("Config new")
        return cls

    def __init__(self):
        print("Config init")

然后,当我创建一个新项目时,我将导入该通用 config class 并为该项目创建一个特定配置 class

# from config import MyConfig

class MyConfiguration(MyConfig):
    def __init__(self, *args, **kwargs):
        super(MyConfiguration, self).__init__(*args, **kwargs)
        print("Configuration init")

当我实例化我的配置时,我会将 __new____init__ 方法都指定为 运行,但只有 运行s __new__

c = MyConfiguration()

这是输出:

Config new

文档说:

If __new__() is invoked during object construction and it returns an instance or subclass of cls, then the new instance’s __init__() method will be invoked like __init__(self[, ...]), where self is the new instance and the remaining arguments are the same as were passed to the object constructor.

If __new__() does not return an instance of cls, then the new instance’s __init__() method will not be invoked.

因为只有 __new__ 方法输出,这意味着我做错了,因为没有调用 __init__ 方法。

欢迎任何帮助。

__init__() 仅当您的 __new__() return 是可以有效调用的对象时才会调用 - 即 class.[= 的实例14=]

在您的示例中,您 return 是 class 本身。

这是您可以做到的一种方式: 要创建 class 和 return 实例而不是 returning class 本身:

from abc import ABCMeta, abstractmethod

class MyConfig(metaclass=ABCMeta):
      def __new__(cls, *args, **kwargs):
            instance = super(MyConfig, cls).__new__(cls, *args, **kwargs)
            print("Config new")
            return instance
      
      def __init__(self, *args, **kwargs):
            print("Config init")

class MyConfiguration(MyConfig):
      def __init__(self, *args, **kwargs):
            super(MyConfiguration, self).__init__(*args, **kwargs)
            print("Configuration init")
        
if __name__ == '__main__':
      c = MyConfiguration()

输出:

Config new
Config init
Configuration init