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
我正在阅读 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