有没有什么好办法可以帮你解决掉争论?

2024-04-24 04:04:46 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我今天才意识到,__new__不推荐用于接收参数,就像Python2.6一样(文档中没有提到这一点,据我所见,__new__调用{}的行为也不正确)。这意味着我的函数代码已经开始发出警告,我想把它们去掉。但我找不到一个优雅的工作方式。在

我有很多类在构建时执行优化。所以我有

class Conjunction(Base):
    def __new__(cls, a, b):
       if a == True: 
          return b
       elif b == True
          return a
       else:
          return super(Conjunction,cls).__new__(cls, a, b)

以此类推(真实版本涵盖更多案例)。因此,与Guido在this response(我能找到的唯一引用)中所说的不同,我的__new__方法使用其参数,不能用重写的__init__函数替换。在

我能做的就是把它分成两部分:

^{pr2}$

但那真是丑陋至极。我是否缺少一种优雅的方法,让类构造函数根据给定的构造函数参数返回任意对象?在


Tags: 方法函数代码文档true警告newbase
3条回答

__new__不是“不推荐用于接收参数”。Python2.6中的变化是,object.__new__object类的__new__方法不再忽略它传递的任何参数。(object.__init__也不再忽略参数,但这只是2.6中的警告。)如果要将参数传递给__new__或{},则不能将object作为继承的终止类。在

为了让任何依赖该行为的代码在2.6中正常工作,您只需将object替换为基类,使用一个基类,该基类正确地接受额外的参数,并且在调用时不而不是传递它们(使用super()

Thomas的回答是正确的,但我要补充的是,在我的例子中,解决方案很简单:向我的基类添加一个__new__方法,代码如下:

class Base(object):
    def __new__(cls, *args, **kws):
        instance = super(Base, cls).__new__(cls)
        instance.__init__(*args, **kws)
        return instance

好吧,这让我很好奇,因为我没有看到文档中的抨击,所以我自己尝试了一下。在

class Foo(object):
    def __new__(cls, a, b):
        if a:
            return a
        elif b:
            return b
        else:
            return super(Foo, cls).__new__(cls, a, b)

    def __init__(self, a, b):
        self.a = a
        self.b = b

class Bar(Foo):
    def __new__(cls, x, y):
        if x:
            return x
        if y:
            return y
        else:
            return super(Bar, cls).__new__(cls, x, y)


foo = Bar(False, False)

正如您在这个例子中看到的,我重写了Foo中的init,因为传递给new的任何参数都将被转发到__new__试图创建的cls实例。具有be的foo实例属于Bar类,但它将有成员a和b。我通过不重写超级类的__init__来调用它。方法__new__总是将其参数传递给__init__。如果不重写对象的__init__,它将失败,因为该方法不接受任何参数。在

这是我对python2.7中new用法的看法。根据文件2.6是相似的。在

相关问题 更多 >