代码之家  ›  专栏  ›  技术社区  ›  EoghanM

python:override_uu init_uuuuargs in_uu new__

  •  3
  • EoghanM  · 技术社区  · 16 年前

    我有一个 __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
    

    SomeOtherClass 可以选择在处理参数时创建,这就是为什么在 _新建__ 而不是在 __init__

    最好的方法是什么 new_args _初始化__ ?

    否则,我将不得不在 _初始化__ (没有一些检查)

    3 回复  |  直到 16 年前
        1
  •  7
  •   EoghanM    16 年前

    最后,我使用的解决方案是在 __new__ 并移除 __init__ 方法:

    def __new__(cls, *args):
       ... # as above
       new_self = super(MyClass, cls).__new__(cls)
       new_self.args = new_args
       return new_self
    
    #def __init__(self, *args):
    #    self.args = args
    
        2
  •  2
  •   EoghanM    16 年前

    编辑 :提出了更好的解决方案-以下行为不够一致。


    我通过一些出乎意料的简单行为来解决我自己的问题:

    return cls(*new_args)
    

    而不是

    return super(MyClass, cls).__new__(cls, *new_args)
    

    它不会像我预期的那样进入无限递归,只要 new_args 与给定的原始参数不同 __new__ .

        3
  •  1
  •   Daniel G    16 年前

    既然您甚至不一定要创建MyClass对象,为什么不把new放到单独的函数中呢? new(*args) 返回一个 MyClass SomeOtherClass 必要时反对?

    这会更整洁一些,因为您知道无论在何处放置myClass(),您都会得到一个myClass对象,而不是潜在的其他类,这可能会有点混乱。