这里有新鲜出炉的 Python3 官方中文指南, 程序狗速度看过来!
Python 编程语言
Python 是一种面向对象, 解释型计算机程序设计语言, 由 Guido van Rossum 于 1989 年底发明, 第一个公开发行版发行于 1991 年. Python 语法简洁而清晰, 具有丰富和强大的类库. 它常被昵称为胶水语言, 它能够把用其他语言制作的各种模块 (尤其是 C/C++) 很轻松地联结在一起.
一般说来, 特殊的方法都被用来模仿某个行为. 下面这篇文章主要给大家介绍了关于 Python 进阶学习之特殊方法的相关资料, 文中通过示例代码介绍的非常详细, 需要的朋友可以参考借鉴, 下面随着小编来一起看看吧.
前言
最近在学习 python, 学习到了一个之前没接触过的 -- 特殊方法.
什么是特殊方法? 当我们在设计一个类的时候, python 中有一个用于初始化的方法 $__init__$, 类似于 java 中的构造器, 这个就是特殊方法, 也叫作魔术方法. 简单来说, 特殊方法可以给你设计的类加上一些神奇的特性, 比如可以进行 python 原生的切片操作, 迭代, 连乘操作等. 在 python 中, 特殊方法以双下划线开始, 以双下划线结束.
一个大例子
数学中有一个表示数的概念叫做向量, 但是 python 中的数据类型却没有. 我们来设法用 python 实现它.
首先考虑, 向量跟普通的数据类型不同, 传统的数可以直接进行运算, 向量则需要对不同的坐标分别运算. 来试试.
首先定义一个类, 实现初始化方法.
# 实现向量类型
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
如何实现向量的加法? 二维向量中, 向量的加法就是每个坐标分别相加得到的结果. 在 python 中有个 $__add__$ 方法, 用来进行加法操作.
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
# 实现向量加法
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
我们对 x 和 y 变量分别进行相加, 然后返回 Vector. 在 python 你可以对字符串直接用加法拼接起来的原理就在此, python 实现了针对字符串的 add 方法.
实现了加法, 乘法的道理一样, 分别对每个坐标单独相乘即可.
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
# 实现向量加法
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
# 实现向量乘法, 例如 r*3
def __mul__(self, scalar):
return Vector(self.x*scalar, self.y*scalar)
我们在进行向量运算时还有一个常用的操作是求向量的模, 我们用 $__abs__$ 特殊方法来实现, abs 一般用来求一个数的绝对值, 向量用不到, 用来求模刚好合适. 使用 math 模块中的 hypot 方法计算 $\sqrt(x^2+y^2)$.
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
# 真假值, 如果向量模为 0, 返回 false
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)
# 实现向量乘法, 例如 r*3
def __mul__(self, scalar):
return Vector(self.x*scalar, self.y*scalar)
# 返回向量的模
# hypot() 返回欧几里德范数 sqrt(x*x + y*y)
def __abs__(self):
return hypot(self.x, self.y)
找个例子运行下.
v = Vector(2, 3)
print(v)
v2 = Vector(4, 5)
print(v+v2)
print(v+v2*2)
<__main__.Vector object at 0x000002B4B1843C50>
<__main__.Vector object at 0x000002B4B1843EF0>
<__main__.Vector object at 0x000002B4B1843898>
可以运行了, 貌似是正确的, 但是输出的结果很奇怪. 怎么办? python 中有个 $__repr__$ 特殊方法, 可以修改控制台输出的样式.
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
# 真假值, 如果向量模为 0, 返回 false
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)
# 实现向量乘法, 例如 r*3
def __mul__(self, scalar):
return Vector(self.x*scalar, self.y*scalar)
# 返回向量的模
# hypot() 返回欧几里德范数 sqrt(x*x + y*y)
def __abs__(self):
return hypot(self.x, self.y)
# 实现__repr__方法, 在控制台打印向量时会输出 Vector(1, 2)
# 实现__str__, 使用 str() 返回字符串
def __repr__(self):
return 'Vector(%r, %r)' % (self.x, self.y)
实现了 $__repr__$ 方法, 我们就可以在控制台输出 Vecotor(x,y). 与之对应的有个 $__str__$ 方法, 使用 str()返回相应的字符串, 展示给用户.
现在来看下之前程序运行的结果.
v = Vector(2, 3)
print(v)
v2 = Vector(4, 5)
print(v+v2)
print(v+v2*2)
print(abs(v))
Vector(2, 3)
Vector(6, 8)
Vector(10, 13)
3.605551275463989
效果不错.
通过实现特殊方法, 自定义类型可以表现的跟内置类型一样, 让我们能够写出更具有 python 风格的代码.
除了上面说到的几个特殊方法外, python 还有差不多 80 多个特殊方法, 比如 $__len__$ 方法可以用来求长度,$__getitem__$ 可以使用 haha[2] 之类的操作进行切片和迭代等, 同样的还有 $__setitem__$.
总结
以上就是这篇文章的全部内容了, 希望本文的内容对大家的学习或者工作具有一定的参考学习价值, 如果有疑问大家可以留言交流, 谢谢大家对 PHPERZ 的支持.
来源: http://www.phperz.com/article/18/0131/361507.html