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.
答案 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的任意数量的关键字参数。在那里,您将创建分配这些值的实例变量。