Chinaunix首页 | 论坛 | 博客

分类: Python/Ruby

2014-03-01 12:19:22

#!/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 里查看帮助信息的话:

>>> help(foo)

阅读(2931) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~