Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有关于“新”失去论据的最佳解决方案的想法?_Python - Fatal编程技术网

Python 有没有关于“新”失去论据的最佳解决方案的想法?

Python 有没有关于“新”失去论据的最佳解决方案的想法?,python,Python,因此,我直到今天才意识到,从python 2.6开始,\uuuuuuu new\uuuu在接收参数时是不受欢迎的(文档中没有提到这一点,就\uuuuuuu new\uuuuu调用\uuuu init\uuu的行为而言,这也是不正确的)。这意味着我的函数代码已经开始发出警告,我想摆脱它们。但我看不到一种优雅的工作方式 我有一堆类,它们在构造时执行优化。所以我有 class Conjunction(Base): def __new__(cls, a, b): if a == T

因此,我直到今天才意识到,从python 2.6开始,
\uuuuuuu new\uuuu
在接收参数时是不受欢迎的(文档中没有提到这一点,就
\uuuuuuu new\uuuuu
调用
\uuuu init\uuu
的行为而言,这也是不正确的)。这意味着我的函数代码已经开始发出警告,我想摆脱它们。但我看不到一种优雅的工作方式

我有一堆类,它们在构造时执行优化。所以我有

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在(我能找到的唯一对它的引用)中所说的不同,我的
\uuuu new\uuuu
方法使用它的参数,并且不能被重写的
\uu init\uuu
函数替换

我所能做的就是将其一分为二:

def Conjunction(a, b):
   if a == True: 
      return b
   elif b == True
      return a
   else:
      return ConjunctionImpl(a, b)

class ConjunctionImpl(Base):
   # ...

但那实在是太难看了,简直让人讨厌。我是否缺少一种让类构造函数根据给定的构造函数参数返回一些任意对象的优雅方法?

\uuuu new\uuu
不是“不推荐用于接收参数”。Python2.6中的变化是对象类的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法
不再忽略它传递的任何参数。(
object.\uuuu init\uuuu
也不再忽略参数,但这只是2.6中的一个警告。)如果要将参数传递给
\uu new\uuuuu
\uuuuu init\uuu
,则不能使用
对象作为继承的终止类


为了使任何代码依赖于该行为在2.6中工作,您只需将
对象
替换为基类,使用一个基类,该基类正确地接受额外的参数,并且不会在调用时传递这些参数(使用
super()

这让我很好奇,因为我在文档中没有看到反对意见,所以我自己尝试了一下

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的任何参数都将被转发到尝试创建的cls实例。foo的实例可能是一个Bar类,但它将有成员a和b。我通过不重写超类的
\uuuu init\uuu
来调用它。方法
\uuuu new\uuuu
总是将其参数传递给
\uuuu init\uuuu
。如果不重写对象的
\uuuu init\uuu
,它将失败,因为该方法不接受任何参数


这是我对Python2.7中使用new的看法。根据文档,2.6是类似的。

托马斯在他的回答中把我说对了,但我应该补充一点,在我的例子中,解决方案很简单:在我的基类中添加一个
\uuuuu new\uuuu
方法,如下行:

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

这不是构造函数应该做的。如果您想要这种行为,请使用函数(如您在第二个示例中所做的)。您能说得更多吗?这与Singleton示例有何不同?Singleton示例一直被用作说明为什么首先需要
\uuu new\uuu
的典型示例。你知道,这就是为什么我喜欢stackoverflow:当PSF的董事会成员停下来回答问题时。谢谢你,托马斯!我从警告信息中猜错了方向。我应该补充一点,我的跟踪中的解决方案很简单:在我的基类中添加一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,行为:def uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我不认为这是正在发生的事情。我不认为它失败了。