【Python】数据模型-实现二维向量

实现Vector类

from math import hypot


class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
        
    def __repr__(self):
        return 'Vector(%r, %r)' % (self.x, self.y)
    
    def __abs__(self):
        return hypot(self.x, self.y)
    
    def __bool__(self):
        return bool(abs(self))
    
    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Vector(x, y)
    
    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)


# 向量加法
v1 = Vector(2, 4)
v2 = Vector(2, 1)
print(v1 + v2)

# 打印向量的模
print(abs(v1))

# 向量的标量乘法(得到的方向一致,模变大)
print(v1 * 3)
print(abs(v1 * 3))

在这里插入图片描述

特殊方法__repr__
通过这个特殊方法来得到一个对象的字符串表达形式。
当我们在控制台打印一个向量的实例时,得到的字符串可能会是<Vector object at 0x10e100070>
在__repr__的实现中,使用了%r来获取对象各个属性的标准字符串表示形式,好处是让Vector(1, 2)和Vector(‘1’, ‘2’)是不一样的,后者在定义中会报错,因为向量对象的构造函数只接受数值,不接受字符串。

__repr__与__str__的区别
__repr__返回的结果更加准确,__str__返回的结果可读性更强
后者是在str()函数被使用,或是用print函数打印一个对象的时候才被调用
如果只想实现其中一个,__repr__较优,因为一个对象如果没有__str__函数,而Python有需要调用它的时候,解释器会用__repr__作为替代

算数运算符(add__和__mul
通过__add__和__mul__实现了 + 和 * 这两个算术运算符
这两个方法的返回值都是新创建的向量对象,被操作的两个向量(self和other)原封不动,代码中只是对这两个的值进行了读取,更接近于运算符的基本原则。

自定义布尔值(bool
如果定义的类不存在__bool__方法,那么bool(x)会尝试调用x.len(),若返回0,则bool会返回False,反之返回True
基于该类是一个实现向量的类,我们将向量的模作为bool的判断依据。如果一个向量的模是0 ,那么就返回False,其他情况则返回True。因为__bool__函数的返回类型应该是布尔型,所以通过bool(abs(self))把模值变为了布尔值

一些Python中的特殊方法

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值