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