1-2 模拟数值类型之一个简单的二维向量

写在前面

流畅的Python中的示例1-2.

一个简单的二维向量

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)

类Vector中__init__()初始化了向量x和y;

__repr__()方法是干什么的呢?在什么场景下需要用到呢?

Python 有一个内置的函数叫 repr ,它能把一个对象用字符串的形式表达出来以便辨认,这就是 “ 字符串表示形式 ” 。

repr 就是通过 __repr__ 这个特殊方法来得到一个对象的字符串表示形式的。如果 没有实现 __repr__ ,当我们在控制台里打印一个向量的实例时,得到的字符串可能会是 <Vector object at 0x10e100070> 。

在 __repr__ 的实现中,我们用到了 %r 来获取对象各个属性的标准字符串表示形式 —— 这是个好习惯,它暗示了一个关键: Vector(1, 2) 和 Vector('1', '2') 是不一样的,后者在我们的定义 中会报错,因为向量对象的构造函数只接受数值,不接受字符串 。

__repr__()方法是将对象返回为字符串。示例: 参考博客http://www.cnblogs.com/superxuezhazha/p/5746922.html

# 任务
# 请给Student 类定义__str__和__repr__方法,使得能打印出<Student: name, gender, score>:


class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender class Student(Person): def __init__(self, name, gender, score): # 继承超类的初始化参数 super(Student, self).__init__(name, gender) self.score = score def __repr__(self): return '<Student: %s, %s, %s>' % (self.name, self.gender, self.score) # 初始化对象 s = Student('leer', 'female', '100') print(s) >>> <Student: leer, female, 100>

对于这个方法,一开始一直没有看懂,不明白这是对__init__()中初始化的参数进行判断,还是对__abs__()方法中返回的值进行判断:

def __bool__(self):
        return bool(abs(self))

读一下bool(abs(self)),可以看出是从abs(self)开始处理的,python中在执行abs()时,会调用特殊方法__abs__(),示例如下:

# 这两个方法具有相同的结果
a = -9
print(a.__abs__())
print(abs(9))
>>>
9 9

在Vector类中重写了__abs__()方法,那么abs(self)的执行顺序就是:先调用__abs__()方法,执行__abs__()方法,返回一个开平方根的值。所以,在这个语句中,就是判断的__abs__()返回值的布尔类型。

那么,在什么情况下,布尔值会为False呢?当向量x和y都为0的时候,所以,bool(abs(self))等价于bool(self.x or self.y)。


__add__()方法和__mul__()方法实现的向量的加法和乘法。注意:这里的加法是向量间的加法,乘法是向量和数字之间相乘。

写在后面

明天继续。

转载于:https://www.cnblogs.com/catleer/p/6845773.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值