如何编写Pythonic对象

那就好好理清楚呗 。

如何编写Pythonic对象

文章插图

如何编写Pythonic对象

文章插图

如何编写Pythonic对象

文章插图

如何编写Pythonic对象

文章插图
在我们开始探索如何写一个Pythonic对象之前,让我们先弄清楚这个术语的含义它不是关于PEP8和尊重其规则来编写漂亮的python代码;而是关于编写对象,最大限度地使用Python数据模型的概念,因此它们可以像Python标准库对象一样被自然地使用 。
如何编写Pythonic对象

文章插图

如何编写Pythonic对象

文章插图

如何编写Pythonic对象

文章插图

如何编写Pythonic对象

文章插图
其思想是将Python ADN注入到我们的用户定义对象中,使它们发生变异,并表现为本地Python对象为此,我们将实现一个向量类来表示多维向量 。
如何编写Pythonic对象

文章插图
下面的代码用最小的实现表示Vector类 。矢量由其坐标表示 。
如何编写Pythonic对象

文章插图
向量坐标存储在浮点数组中;请注意将数组中的元素类型强制设置为浮点的array type=“d” 。我们可以将任何iterable传递给Vector的构造函数,因为数组的构造函数用作接受任何iterable(元组、列表等)的内部容器 。
当我们打印一个向量对象本身时,注意我们得到它的引用(CPython的内存地址)而不是它的坐标 。让我们通过在类中实现_str_方法来更改它,使其具有更友好的输出,例如(x,y,z,…) 。
当我们打印一个向量对象本身时,注意我们得到它的引用(CPython的内存地址)而不是它的坐标 。让我们通过在类中实现_str_方法来更改它,使其具有更友好的输出,例如(x,y,z,…)注意,我们使用了从数组创建的元组的字符串表示 。
__str_不是Python数据模型用于打印对象的weiyi方法;_repr_还用于提供更面向调试目的的对象表示可以计算此表示以使用eval函数创建相同的对象 。
在前面的代码块中,请注意,与eval一起使用时repr的返回值允许创建新向量reprlib的使用允许我们在数组包含太多元素的情况下不打印数组的所有元素,并用就像向量v2 。
Python迭代为了确保我们可以在向量上循环,并且可以将它们解包,我们需要使它们可迭代为此,必须向我们的类中添加_iter_方法 。
Python长度计算为了能够通过将对象赋给len函数来获得向量内的坐标数,必须将_Len_方法添加到类中 。
Python的比较在不调整类以支持比较的情况下,应用于两个向量对象的==运算符将比较它们的引用 。若要更改此行为,必须实现“eq”方法 。在我们的例子中,两个向量是相等的,当且仅当它们具有相同的坐标且具有相同的顺序 。
让我们花点时间分析一下新的方法:通过调用len函数来使用len方法 。
通过将self和其他参数传递给zip函数来使用iter方法,zip函数接受iterable作为参数 。
Pythonic绝对值
对于此示例,我们使用该 __abs__ 方法返回由以下表达式定义的向量的欧几里得范数:
Pythonic布尔求值对于向量类的当前实现,我们在计算向量的布尔值时有以下行为 。
在我们的类中,如果没有bool方法,对bool函数的调用将引用该方法如果长度等于0,则对象的计算结果为false-否则,其计算结果为true 。


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。