【发布时间】:2014-10-09 15:52:05
【问题描述】:
我希望B 成为某个类A 的子类,并且我想覆盖A.__new__1。通常,我的代码将具有以下基本结构:
class B(A):
def __new__(cls, ...):
ret = super(B, cls).__new__(cls, ...)
# modify ret as needed
return ret # type(ret) is cls
# ...
这样,type(B(...)) 确实是B。 (注意:super(B, cls).__new__(cls, ...) 中的省略号不必与B.__new__ 的签名中的省略号所代表的项目相同。)
但是现在假设我想使用一些工厂方法/函数 A_Factory(它返回一个A类型的对象)返回的值作为变量@987654331的起始值@ 在构造函数中。如果我只是这样编码:
class B(A):
def __new__(cls, ...):
ret = A_Factory(...)
# modify ret as needed
return ret # type(ret) is A
...那么type(B(...)) 将是A,而不是B。
在上面B.__new__ 的第二个版本中设置ret 类的正确方法是什么,type(B(...)) 是B,更一般地说,对于任何直接或间接子类@987654340 B,type(C(...))的@是C?
1 我知道通常不需要覆盖父类的__new__,但在这里我对需要覆盖的不常见情况感兴趣。
【问题讨论】:
-
您坚持使用
__new__还是愿意接受替代解决方案?