我有一个__new__
方法,如下所示:
class MyClass(object):
def __new__(cls, *args):
new_args = []
args.sort()
prev = args.pop(0)
while args:
next = args.pop(0)
if prev.compare(next):
prev = prev.combine(next)
else:
new_args.append(prev)
prev = next
if some_check(prev):
return SomeOtherClass()
new_args.append(prev)
return super(MyClass, cls).__new__(cls, new_args)
def __init__(self, *args):
...
但是,此操作失败,并显示弃用警告:
DeprecationWarning: object.__new__() takes no parameters
在处理args时,可以选择创建SomeOtherClass
,这就是为什么在__new__
而不是__init__
中处理它们的原因
将new_args
传递到__init__
的最佳方法是什么?
否则,我将不得不在__init__
中重复处理args(没有some_check)
4条答案
按热度按时间ryevplcw1#
我最终采用的解决方案是修改
__new__
中新创建的对象,并完全删除__init__
方法:t5zmwmid2#
既然您甚至不必创建MyClass对象,为什么不将new放入一个单独的函数
new(*args)
中,该函数在必要时返回MyClass
或SomeOtherClass
对象?这样会更简洁一些,因为您知道无论在何处放置MyClass(),都会返回一个MyClass对象,而不是可能的SomeOtherClass,这可能会有点混乱。
j2datikz3#
编辑:找到了一个更好的解决方案-以下问题的表现不够一致。
我已经解决了我自己的问题,因为我偶然发现了一些出乎意料的简单行为:
代替
只要
new_args
与最初给__new__
的参数不同,它就不会像我预期的那样进入无限递归。o75abkj44#
嗯......这个适合我
或者这里有一个更好更一般的答案:
在我的python 3.7.3上试了一下: