双下方法的简单实例

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

posted @ 2019-11-19 11:02  烧刘病  阅读(97)  评论(0编辑  收藏  举报
回到页首