首页 > 代码库 > 每天十分钟,十二天入门Python(十)

每天十分钟,十二天入门Python(十)

# __str__()

class Dog(object):

    def __init__(self,name):

        self.name = name

    def __str__(self):

        return ‘Dog object(%s)‘ % self.name


print Dog(‘papa‘)

# <__main__.Dog object at 0x1016b6cd0>

# Dog object(papa)


这是__str__()添加前后的分别输出的结果

# __iter__()


#!/usr/bin/env python

# -*- coding: utf8 -*-

__author__ = ‘shijn‘


class Fib(object):

    def __init__(self):

        self.a,self.b = 0,1

    def __iter__(self):

        return self

    def next(self):

        self.a = self.b

        self.b = self.a + self.b

        if self.a>1000:

            raise StopIteration();

        return self.a


for n in Fib():

    print n


# 1

# 2

# 4

# 8

# 16

# 32

# 64

# 128

# 256

# 512


# 通过__iter__()可以让一个类可以被for...in循环所作用,__iter__()返回一个迭代对象,然后Python的佛如循环不断调用该迭代对象的next()方法拿到循环的下一个值,知道遇到StopIteration错误时退出循环.

# __getitem__()

# 上面代码实现了让一个自定义类可以像list一样进行for...in循环,不过它并不能像list一样通过下标取出对应的数据,类似这样fib()[2]是不行的.要想实现还需要在类内部实现一个__getiterm__()方法,根据它第二个参数进行判断不同的情况可以实现下标和切片等功能.


class Fib(object):

    def __getitem__(self, item):

        a,b = 1,1

        for x in range(item):

            a,b = b,a+b

        return a

f = Fib()

print f[20]

# 10946


# 类似的还有__setitem__()方法,把对象视作list或者dict来对集合赋值,还有__delitem__()用于删除某个元素.

# __getattr__()

# 如果一个属性不存在,默认情况下会报错.如果我们想控制这个地方,或者让一些特殊情况不报错,可以通过__getattr__()方法,比如当调用不存在的属性name时,Python解释器会试图调用__getattr__(self,’name‘)来获取相应的属性.


class Fib(object):

    def __getattr__(self, item):

        if item == ‘name‘:

            return ‘sky‘


f = Fib()

print f.name

# __call__()

# 对象实例通常有自己的属性和方法,当我们调用实例方法的时候,我们用instance.method()来调用.如果想直接在实例本身上调用,只需要实现__call__()即可.


class Dog(object):

    def __init__(self,name):

        self.name = name

    def __call__(self, *args, **kwargs):

        print ‘dog name is %s‘ % self.name


dog = Dog(‘papa‘)

dog()

# dog name is papa


通过callable(Dog())函数我们可以判断一个对象是否能被调用.

# type()

# 之前有介绍过通过type()获取对象的类型,更进一步它还可以创建新的类型.对于Python这样的动态语言来讲,函数和类的定义不仅在编译时也可以在运行时.


def fun(self,name=‘shijn‘):

    print ‘hello %s‘ % name


Hello = type(‘Hello‘,(object,),dict(hello=fun,age=‘22‘))


h = Hello()

h.hello()

print h.age

# hello shijn

# 22


# 可以看到Hello就是一个完整的类,因为Python创建类的过程实质上就是扫描class定义的语法,然后调用type()创建了类.三个参数分别是:类的名字,继承的父类(注意单个tuple写法,可以多继承),绑定的方法或者默认属性.

metaclass

元类的概念的就是通过它能创建或者修改类,元类->类->类的实例,从这种关系看类也可以说是元类的实例.

元类在一般的应用中使用频率极低.

每天十分钟,十二天入门Python(十)