双下方法的简单实例
0 Vector2d实例的分量可以直接通过属性访问(无需调用读值方法) 2 Vector2d实例可以拆包成变量元组 3repr函数调用 Vector2d实例,得到的结果类似于构建实例的源码。Vector2d(3.0,4.0) 4这里使用eval函数,表明repr函数调用 Vector.2d实例得到的是对构造方法的准确表述。 5实例支持使用=比较;这样便于测试。 6 print函数会调用str函数,对 Vector2d来说,输出的是一个有序对 7bytes函数会调用 bytes_方法,生成实例的二进制表示形式。 8abs函数会调用_abs_方法,返回 Vector2d实例的模。 9bool函数会调用bool_方法,如果 Vector2d实例的模为零,返回 False,否则返回True from array import array import math class Vector2d: typecode = 'd' def __init__(self, x, y): '''类外直接拿到属性''' self.x = float(x) self.y = float(y) def __iter__(self): '''返回可迭代的对象''' return (i for i in (self.x, self.y)) def __str__(self): return str(tuple(self)) def __repr__(self): '''*的作用,拆包''' class_name = type(self).__name__ return '{}({!r},{!r})'.format(class_name, *self) def __eq__(self, other): return tuple(self) == tuple(other) def __bytes__(self): return (bytes([ord(self.typecode)]) + bytes(array(self.typecode, self))) def __abs__(self): '''欧几里得范式sqrt(x*x + y*y)。''' return math.hypot(self.x, self.y) def __bool__(self): return bool(abs(self)) v1 = Vector2d(3.0, 4.0) print(v1.x, v1.y) # 可拆包 x, y = v1 print(x, y) print(v1) # 只是调用打印或显示的时候调用str方法 print(repr(v1)) v1_clone = eval(repr(v1)) # (3.0, 4.0) print(v1 == v1_clone) # True print(bytes(v1)) print(abs(v1)) print(bool(v1))
123