
float是不可变的,因此它
__init__的 初始化 程序基本上是一个空 *** 作-
在那里什么都不会发生,因为
self对象无法更改(如果它实际上
float是子类的实例,而不是子类的实例),但是当然必须
float自己
__init__根据该假设进行 *** 作;-)。
因此,所有的行动发生在
__new__中, 构造
适当的,就像其他不可变的类型,如
int,
str,
tuple,等。一个普遍的错误是认为它
__init__是一个构造函数:不是,它以一个已经构造的对象作为它的第一个参数
self,然后“初始化”它(如果可行,即,如果
self是可变的!-)-
构造 本身发生在
__new__。
因此,您的
float子类应该开始:
class My_Number(float): def __new__(cls, float_string): try: return float.__new__(cls, float_string) except (TypeError, ValueError): raise My_Error(float_string)
并且您可以删除
__init__,不需要。现在:
>>> n = My_Number('foo')Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in __new__NameError: global name 'My_Error' is not defined(当然,如果 确实
My_Error定义了异常类,它会更好;-)。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)