【发布时间】:2021-03-23 19:42:15
【问题描述】:
我正在阅读有关 __new__ 和 __init__ 的继承和使用的 Python 文档
https://docs.python.org/3/reference/datamodel.html#basic-customization
我正在尝试创建一个类“config”,它将是一个通用类,其中包含我所有项目共有的所有基本方法
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 类并为该项目创建一个特定的配置类
# from config import MyConfig
class MyConfiguration(MyConfig):
def __init__(self, *args, **kwargs):
super(MyConfiguration, self).__init__(*args, **kwargs)
print("Configuration init")
当我实例化我的配置时,我会指定 __new__ 和 __init__ 方法运行,但只运行 __new__
c = MyConfiguration()
这是输出:
Config new
文档说:
如果在对象构造期间调用
__new__(),它返回一个实例或cls的子类,那么新实例的__init__()方法将像__init__(self[, ...])一样被调用,其中self是新实例,其余参数是与传递给对象构造函数的相同。
如果
__new__()没有返回cls的实例,那么新实例的__init__()方法将不会被调用。
由于只有__new__ 方法的输出,这意味着我做错了,因为__init__ 方法没有被调用。
欢迎任何帮助。
【问题讨论】:
-
__init__()只有在您的__new__()返回可以有效调用的内容时才会调用 - 即类的实例。您正在返回课程本身。 -
谢谢。我想我没有完全理解 new 应该返回什么。
-
更准确地说,
__init__仅在__new__返回cls(的子类)的实例时调用
标签: python new-operator init