2016-07-29 35 views
-3

According to the docs,蟒蛇__new__ - 必须使用<code>super(currentclass, cls).__new__(cls[, ...])</code>适当的参数调用 超类的<code>__new__()</code>方法,然后修改 新创建的实例作为返回CLS的实例

典型实现创建该类的新实例必须在返回之前。
...

如果__new__不返回CLS的实例,那么新 实例的__init__()方法将不会被调用。

simplest implementation of __new__:

class MyClass: 
    def __new__(cls): 
     RetVal = super(currentclass, cls).__new__(cls) 
     return RetVal 

究竟如何super(currentclass, cls).__new__(cls[, ...])返回cls类型的对象?

该声明调用object.__new__(cls)其中clsMyClass

那么类object如何知道如何创建MyClass类型?

+1

你*告诉*它返回的对象应该有什么类型。这就是'cls'参数的用途。 – user2357112

+0

@ user2357112我没有得到你的答案。它期望的返回类型是'cls'。 'super(currentclass,cls).__ new __(cls)'如何返回一个'cls'?你是说它隐式地投射它? – Adrian

+1

'object .__ new__'查看你通过它的'cls'参数,并说:“哎,我想阿德里安想要一个'cls'类型的对象,我应该制作其中的一个。 – user2357112

回答

0

几件事情,首先你需要从object写明确的继承这样的:

class MyClass(object): 

你应该阅读蟒蛇约old classes and new classes(仅适用于蟒2,在Python 3也没关系)

对于你的问题,我想你错过了super()函数的要点或语法。再次,小的改变你的代码:使用super(MyClass, cls)和调用一个方法,从这个父类

RetVal = super(MyClass, cls).__new__(cls) 

这样您引用父级(当然你也可以用任何其他方法)

编辑 阅读您的意见后,我只补充一点,super()不必带任何参数在Python 3,所以也许这对你更微不足道。强烈建议阅读更多关于cls对象的super()here

+0

我理解预期的效果。除了'MyClass'之外,我没有得到将'cls'传递给'super' **的东西。 – Adrian

+0

我知道'issubclass(class2,class1)'必须是true,但为什么'super'需要'cls'返回它返回的任何内容? – Adrian

+0

这是关于'super()'的问题,而不是'__new __()'的问题。 –

1

super(MyClass, cls).__new__(cls)首先搜索MRO(方法解析顺序)(跳过过去MyClass在该序列中),直到找到一个__new__属性的对象。

在你的情况,那就是object.__new__

>>> class MyClass: 
...  def __new__(cls): 
...   RetVal = super(MyClass, cls).__new__(cls) 
...   return RetVal 
... 
>>> MyClass.__mro__ 
(<class '__main__.MyClass'>, <class 'object'>) 
>>> hasattr(MyClass.__mro__[1], '__new__') 
True 

,但如果你的子类MyClass和混合另一个类到MRO与__new__方法则可能是另一种方法。

object.__new__在C中实现,参见object_new() function;它包含一个抽象基类的钩子,以确保你没有尝试实例化一个抽象类,然后委托到tp_alloc插槽,该插槽通常将设置为PyType_GenericAlloc,该插槽将新的PyObject结构添加到堆中。它是表示解释器实例的结构。

+0

'currentclass'不应该被'MyClass'取代吗? – Adrian

+1

@Adrian:我在你的问题中关注你的例子。是的,正确的调用将使用“MyClass”。 –

+0

好的。那么你可以指出**文档**,它解释了什么'super(MyClass,cls)'**表示**,即super如何作用于它的两个参数来返回。 。 。无论它返回。 [Python.org](https://docs.python.org/3/library/functions.html#super)没有声明这个信息。 – Adrian

相关问题