首页 > 代码库 > 每天十分钟,十二天入门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(十)