Python 使用 __new__ 没有默认初始化
Python use __new__ with no default init
我有以下代码在没有传递参数和传递参数时创建水果对象。
我正在努力实现,为此我得到了TypeError: object() takes no parameters
class Fruit:
def __new__(cls, *args, **kwargs):
return object.__new__(cls,"empty name")
def __init__(self, fruitname):
self.__fruit_name = fruitname
预期代码有效。
apple = Fruit("apple")
empty = Fruit()
我认为以下内容足以满足您的描述:
class Fruit:
def __init__(self, fruitname = "empty name"):
self.__fruit_name = fruitname
错误的原因是object.__new__()
(这个函数不需要任何参数)使用不当,实际上这里不需要。
执行此操作的正确方法是子类化:
class Fruit(object):
def __new__(cls, *args, **kw):
return super().__new__(cls)
您可能会看到的代码是:
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
因为您传递了一个不受支持的额外参数。
但是 __new__
是多余的。您根本不需要在这里使用它,除非您正在做一些花哨的元编程,否则您可能根本不需要重写 __new__
。
只需初始化 __init__
中的所有变量,就可以了。
我有以下代码在没有传递参数和传递参数时创建水果对象。
我正在努力实现,为此我得到了TypeError: object() takes no parameters
class Fruit:
def __new__(cls, *args, **kwargs):
return object.__new__(cls,"empty name")
def __init__(self, fruitname):
self.__fruit_name = fruitname
预期代码有效。
apple = Fruit("apple")
empty = Fruit()
我认为以下内容足以满足您的描述:
class Fruit:
def __init__(self, fruitname = "empty name"):
self.__fruit_name = fruitname
错误的原因是object.__new__()
(这个函数不需要任何参数)使用不当,实际上这里不需要。
执行此操作的正确方法是子类化:
class Fruit(object):
def __new__(cls, *args, **kw):
return super().__new__(cls)
您可能会看到的代码是:
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
因为您传递了一个不受支持的额外参数。
但是 __new__
是多余的。您根本不需要在这里使用它,除非您正在做一些花哨的元编程,否则您可能根本不需要重写 __new__
。
只需初始化 __init__
中的所有变量,就可以了。