#!/usr/bin/env python3
"""
A demonstration of classes and their special methods in Python.
"""
class Vec:
"""A simple vector class.
Instances of the Vec class can be constructed from numbers
>>> a = Vec(1, 2, 3)
>>> b = Vec(3, 2, 1) #注意>>>后面的空格
added #注意与上面的空行
>>> a + b
Vec(4, 4, 4)
subtracted
>>> a - b
Vec(-2, 0, 2)
and multiplied by a scalar on the left
>>> 3.0 * a
Vec(3.0, 6.0, 9.0)
or on the right
>>> a * 3.0
Vec(3.0, 6.0, 9.0)
"""
def __init__(self, *v): #当我们不清楚还有多少个元素时,就用*args代替. 注意是元组类型.
self.v = list(v) #不需要return,在__init__函数调用之前,已经有了实例对象了.
@classmethod #定义了一个类方法,所以cls就是Vec类对象.
def fromlist(cls, v):
if not isinstance(v, list):
raise TypeError
inst = cls() #难道这是默认构造方法,非也,这是因为__init__(slef, *v), *v表示零个或多个.
inst.v = v
return inst #作用是返回一个Vec实例的对象,还有这个功能.
#print (实例对象), 被调用.
def __repr__(self):
args = ', '.join(repr(x) for x in self.v)
return 'Vec({})'.format(args)
#调用内置函数len时,被调用.
def __len__(self):
return len(self.v)
# 中介绍了该函数的作用.使用x[key]索引操作符的时候调用
def __getitem__(self, i):
return self.v[i]
'''
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> c=[7,8]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)
[(1, 7), (2, 8)]
'''
def __add__(self, other):
# Element-wise addition
v = [x + y for x, y in zip(self.v, other.v)] #连的也太长了吧? print 'x' if 1 else "", 还记得这个. 注意生成的是列表.
return Vec.fromlist(v)
def __sub__(self, other):
# Element-wise subtraction
v = [x - y for x, y in zip(self.v, other.v)]
return Vec.fromlist(v)
def __mul__(self, scalar):
# Multiply by scalar
v = [x * scalar for x in self.v]
return Vec.fromlist(v)
__rmul__ = __mul__ #应该是对应3.0 * vec的情况.
def test():
import doctest #定义的位置很特别
doctest.testmod() #要想测试成功,必须实现__repr__函数
test()
总结:
1、《Python参考手册》的3.9章节:对象行为与特殊方法,介绍了许多特殊的类方法,对于实现一个nice类应该很实用。
2、向博客中复制粘贴的时候,总是将TAB给忽略掉了,每次还得重新手动对齐。下次就用python来实现一个TAB到空格的转换吧,虽然VIM本身就可以.
3、自己写的注释很乱,函数注释方法.
4、doctest模块的使用。在编写供别人使用的模块时,很有用。注意实在Vec定义中包含的测试内容。
5、zip的使用,新的产生实例的方法.
doc string
def foo(): """This is an example of foo."""
return 'foo'
这里我们看到 """This is an example of foo.""" 就是 doc string。
doc string 有什么用呢?如果你在 repl 里查看帮助信息的话:
阅读(3016) | 评论(0) | 转发(0) |