Python学习笔记:06魔法方法和迭代器

魔法方法,属性和迭代器

新式类

通过赋值语句__metaclass=true或者class NewStyle(object)继承内建类object,可以表明是新式类。

构造方法

对象被创建后,会立即调用的构造方法

class Foobar:
    def __init__(self,value=42):
        self.somevar=value
fb=Foobar()
print fb.somevar
42

重写

通过重写超类的方法,可以自定义继承的行为

class A(object):
    def __init__(self):
        self.name='default'
    def greet(self):
        print 'I am A' ,self.name
class B(A):
    def __init__(self):
        super(B, self).__init__()
    def greet(self):
        print 'I am B' ,self.name
a=A()
a.greet()
b=B()
b.greet()
I am A default
I am B default

基本的序列和映射规则

通过定义规则中的方法,可以像序列一样访问对象
__len__
__getitem__
__setitem__
__delitem__

class squares(object):
    def __getitem__(self,key):
        return key*key
s=squares()
s[5]
        
25

property函数

通过property函数虚拟出新的属性

class Rect(object):
    def __init__(self):
        self.w=0
        self.h=0
    def setSize(self,size):
        self.w,self.h=size
    def getSize(self):
        return self.w,self.h
    size=property(getSize,setSize)
rec=Rect()
rec.size= (10,20)
print rec.size
(10, 20)

静态方法和类成员方法

__metalclass__ = type
class MyClass(object):
    @staticmethod
    def smeth():
        print 'this is a static method'
        
    @classmethod
    def cmeth(cls):
        print 'this is a class method', cls
MyClass.smeth()
MyClass.cmeth()
this is a static method
this is a class method <class '__main__.MyClass'>

属性魔法函数__getattr__

在访问特性的时候回执行getattr方法

__metaclass__ = type
class Rect:
    def __init__(self):
        self.width=0
        self.height=0
    def __getattr__(self,name):
        if name=='size':
            return self.width,self.height
rect=Rect()
rect.size
(0, 0)

迭代器

__metaclass__ = type
class Fibs:
    def __init__(self):
        self.a=0
        self.b=1
    def next(self):
        self.a,self.b=self.b,self.a+self.b
        if self.b >100:
            raise StopIteration
        return self.b
    def __iter__(self):
        return self;
fib=Fibs()
for f in fib:
    if f > 1000:
        break
    print f

1
2
3
5
8
13
21
34
55
89
fib=Fibs()
lf=list(fib)
lf
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

生成器

生成器是一种用普通函数语法定义的迭代器。函数每次执行到yield时就冻结,然后等待下一次访问时继续执行到下一个yield

def myYield():
    for i in range(5):
        yield i
m=myYield()
type(m)
generator
list(m)
[0, 1, 2, 3, 4]
m2=myYield()
for i in m2:
    print i
0
1
2
3
4
myYield
<function __main__.myYield>

send函数,外部向生成器发送消息

def repeater(value):
    while True:
        new = (yield value)
        if new is not None: value = new
r=repeater(42)
r.next()
42
r.next()
42
r.send(100)
100
r.next()
100

posted @ 2016-07-17 08:55  sunqiang  阅读(310)  评论(0编辑  收藏  举报