zoukankan      html  css  js  c++  java
  • 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__()方法实现的向量的加法和乘法。注意:这里的加法是向量间的加法,乘法是向量和数字之间相乘。

    写在后面

    明天继续。

  • 相关阅读:
    【HEOI2016】序列
    【AHOI2006】基因匹配
    【HAOI2016】放棋子
    【TJOI2017】DNA
    Luogu5110 块速递推
    长链剖分学习笔记
    【Vijos】lxhgww的奇思妙想
    [python 学习] requests 库的使用
    [php代码审计] Window api函数 FindFirstFile 在php中的问题
    [php代码审计] apache 后缀名解析“漏洞”
  • 原文地址:https://www.cnblogs.com/catleer/p/6845773.html
Copyright © 2011-2022 走看看