python __new__ - 如何在不进行子类化时实现

时间:2016-07-29 13:27:53

标签: python

A部分

我想对类实例化​​的参数进行一些检查,如果对甚至创建对象没有意义,可能会返回None

我已经阅读了文档,但在这种情况下我不理解返回什么

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

X {@ 1}}应该包含哪些内容?

  • 它不能是return X,因为该对象尚不存在,因此self在此上下文中不是有效关键字。

B部分

与我的问题相关,我不理解需要拥有self参数。

如果您致电cls的构造函数 - MyClass - var = MyClass(1)将永远不是cls吗? 怎么可能是别的?

根据文档,MyClass中的cls是:

  

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

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

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