2016-07-29 67 views
1

A部分蟒蛇__new__ - 如何在不继承

实现我想要做的一些参数来检查一个类的实例,并可能返回None,如果它没有意义,甚至创建对象。

我已阅读文档,但我不明白在这种情况下返回

class MyClass: 
    def __new__(cls, Param): 
     if Param == 5: 
      return None 
     else: 
      # What should 'X' be? 
      return X 

我应该Xreturn X

  • 它不可能是self因为对象不存在,却又如此self是不是在这方面有效的关键字。

B部分

绑在我的问题,我不明白需要cls参数。

如果您打电话给MyClass的构造函数 - var = MyClass(1) - 是不是cls总是MyClass
它怎么可能是其他的东西?

根据该文档,clsobject.__new__(cls[, ...])是:

. . .the class of which an instance was requested as its first argument.

+0

你最有可能比返回'None'更适合抛出异常。 – DeepSpace

+0

@DeepSpace注意。但在某些情况下返回“无”可能是有意义的。 – Adrian

+0

没关系,只要你记得那个。 – DeepSpace

回答

0

(我假设,因为你提供的链接到Python 3个文档您正在使用Python 3)

X可能是super().__new__(cls)

super()返回父类(在这种情况下,它只是object)。大多数情况下,当你重写方法时,你需要在某个时候调用父类的方法。

见这个例子:

class MyClass: 
    def __new__(cls, param): 
     if param == 5: 
      return None 
     else: 
      return super().__new__(cls) 

    def __init__(self, param): 
     self.param = param 

然后:

a = MyClass(1) 

print(a) 
print(a.param) 

>> <__main__.MyClass object at 0x00000000038964A8> 
1 

b = MyClass(5) 

print(b) 
print(b.param) 

>> None 
    Traceback (most recent call last): 
    File "main.py", line 37, in <module> 
    print(b.param) 
    AttributeError: 'NoneType' object has no attribute 'param' 
+0

'super()'返回什么? – Adrian

+0

我读过[超级文档](https://docs.python.org/3/library/functions.html#super),但我毫无疑问困惑。 – Adrian

+0

@Adrian'super()'返回父类,在本例中为'object'。我认为你正在使用Python 3,是否正确? – DeepSpace

0

你可以只返回这样return object.__ new__(cls) CLS的实例。因为每个类都是object的子类,所以可以将其用作类的对象创建者。回传对象作为第一个参数传递给__init__(),并传递给任何数量的位置参数或任何数量的关键字参数。在那里您将创建分配这些值的实例变量。

+0

如何返回'cls'的实例? [这是'__init__'被调用的必要条件。](https://docs.python.org/3/reference/datamodel.html#object.__new__) – Adrian

+0

这个问题就像python如何创建对象一样。对于每个objcet创建,在调用__init __(),__ new __()之前。参考这个页面,这可能会给你一个清晰的想法。 http://eli.thegreenplace.net/2012/04/16/python-object-creation-sequence –

+0

“......一个实例被请求作为它的第一个参数的类。”这意味着班级的名字。如果你打印'cls',它将打印它为'__main __。MyClassName' –