所以,我今天才意识到,__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}$但那真是丑陋至极。我是否缺少一种优雅的方法,让类构造函数根据给定的构造函数参数返回任意对象?在
__new__
不是“不推荐用于接收参数”。Python2.6中的变化是,object.__new__
,object类的__new__
方法不再忽略它传递的任何参数。(object.__init__
也不再忽略参数,但这只是2.6中的警告。)如果要将参数传递给__new__
或{object
作为继承的终止类。在为了让任何依赖该行为的代码在2.6中正常工作,您只需将
object
替换为基类,使用一个基类,该基类正确地接受额外的参数,并且在调用时不而不是传递它们(使用super()
)Thomas的回答是正确的,但我要补充的是,在我的例子中,解决方案很简单:向我的基类添加一个
__new__
方法,代码如下:好吧,这让我很好奇,因为我没有看到文档中的抨击,所以我自己尝试了一下。在
正如您在这个例子中看到的,我重写了Foo中的init,因为传递给new的任何参数都将被转发到
__new__
试图创建的cls实例。具有be的foo实例属于Bar类,但它将有成员a和b。我通过不重写超级类的__init__
来调用它。方法__new__
总是将其参数传递给__init__
。如果不重写对象的__init__
,它将失败,因为该方法不接受任何参数。在这是我对python2.7中new用法的看法。根据文件2.6是相似的。在
相关问题 更多 >
编程相关推荐