python 定制类
2015-12-24 14:56
459 查看
__str__
class Student():
def __init__(self):
self.name = name
def __str__(self):
return 'Student object name: %s' % self.name
__repr__ = __str__
因为直接显示变量调用的不是
__iter__
如果一个类想被用于
class Fib(object):
def __init__(self):
self.a, self.b = 0,1#初始化a, b
def __iter__(self):
return self #实例本身就是迭代对象,返回自己
def next(self):
self.a, self.b = self.b, self.a + self.b #计算下一个值
if self.a >100000:#退出循环的条件
raise StopIteration():
return self.a
__getitem__
class Fib():
def__getitem__(self,n):
a, b = 1,1
for x in range(n):
a, b = b, a+b
return a
class Fib(onject):
def __getitem__(self, n ):
if isinstance(n, int):
a, b = 0,1
for x in range(n):
a,b = b, a+b
return a
if isinstance(n,slice):
start = n.start
stop = n.stop
a,b = 1,1
L = []
for x in range(stop):
if x> = start:
L.append(a)
a,b = b,a+b
return L
__getattr__
class Student(object):
def __init__(self):
self.name = 'dsadsa'
属性有name, 但是想要访问score属性是不能的,所以,需要出了加上score的属性,还可以写一个__getattr__方法,动态返回一个属性
class Student(object):
def __init__(self):
self.name = 'dsads'
def __get__attr__(self,attr):
if attr =='score'
return 99
当调用不存在的score属性时,python解释器会试图调用__getattr__(self,attr)来尝试获得属性,就可以返回score的值
也可以返回函数
class Student(object):
def __getattr__(self, attr):
if attr =='age'
return lambda:25
raise AttribueError(
__call__
一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用
class Student(object):
def __init__(self):
self.name = name
def __call__(self):
print 'My name is %s. ' % self.name
#调用方式
s = Student('dsad')
s()
My name is dsad.
__call__还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。
如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。
那么,怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个
callable(Student())
True
call(max)
True
callable([1,2,3])
False
callbale(None)
False
callable('string')
False
通过
class Student():
def __init__(self):
self.name = name
def __str__(self):
return 'Student object name: %s' % self.name
__repr__ = __str__
因为直接显示变量调用的不是
__str__(),而是
__repr__(),两者的区别是
__str__()返回用户看到的字符串,而
__repr__()返回程序开发者看到的字符串,也就是说,
__repr__()是为调试服务的。解决办法是再定义一个
__repr__()。但是通常
__str__()和
__repr__()代码都是一样的
__iter__
如果一个类想被用于
for ... in循环,类似list或tuple那样,就必须实现一个
__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的
next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
class Fib(object):
def __init__(self):
self.a, self.b = 0,1#初始化a, b
def __iter__(self):
return self #实例本身就是迭代对象,返回自己
def next(self):
self.a, self.b = self.b, self.a + self.b #计算下一个值
if self.a >100000:#退出循环的条件
raise StopIteration():
return self.a
[code]>>> for n in Fib(): ... print n ... 1 1 2 3 5 ... 46368 75025
__getitem__
class Fib():
def__getitem__(self,n):
a, b = 1,1
for x in range(n):
a, b = b, a+b
return a
[code]>>> f = Fib() >>> f[0] 1 >>> f[1] 1 >>> f[2] 2
class Fib(onject):
def __getitem__(self, n ):
if isinstance(n, int):
a, b = 0,1
for x in range(n):
a,b = b, a+b
return a
if isinstance(n,slice):
start = n.start
stop = n.stop
a,b = 1,1
L = []
for x in range(stop):
if x> = start:
L.append(a)
a,b = b,a+b
return L
__getattr__
class Student(object):
def __init__(self):
self.name = 'dsadsa'
属性有name, 但是想要访问score属性是不能的,所以,需要出了加上score的属性,还可以写一个__getattr__方法,动态返回一个属性
class Student(object):
def __init__(self):
self.name = 'dsads'
def __get__attr__(self,attr):
if attr =='score'
return 99
当调用不存在的score属性时,python解释器会试图调用__getattr__(self,attr)来尝试获得属性,就可以返回score的值
也可以返回函数
class Student(object):
def __getattr__(self, attr):
if attr =='age'
return lambda:25
raise AttribueError(
'\'Student\' object has no attribute \'%s\'' % attr)
__call__
一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用
instance.method()来调用。能不能直接在实例本身上调用呢?类似
instance()?在Python中,答案是肯定的。任何类,只需要定义一个
__call__()方法,就可以直接对实例进行调用。
class Student(object):
def __init__(self):
self.name = name
def __call__(self):
print 'My name is %s. ' % self.name
#调用方式
s = Student('dsad')
s()
My name is dsad.
__call__还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。
如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。
那么,怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个
Callable对象,比如函数和我们上面定义的带有
__call()__的类实例:
callable(Student())
True
call(max)
True
callable([1,2,3])
False
callbale(None)
False
callable('string')
False
通过
callable()函数,我们就可以判断一个对象是否是“可调用”对象。
相关文章推荐
- 【python】if __name__ == '__main__'
- 在Mac OS上搭建Python的开发环境
- python反射
- python的元类---类的类
- 每天学点Python之bytes
- Flask中session的用法
- Python 的OS 模块(一)
- python 多重继承
- Python语言十分钟快速入门
- 快速学习 Python 数据分析包 之 pandas
- progressbar模块学习笔记
- 使用 Python 的 SQLite JSON1 和 FTS5 扩展
- head first python /chapter7 web
- python中的缩进问题
- 使用 Python 的 SQLite JSON1 和 FTS5 扩展
- 摘自 python 代理
- python mysql增删改查
- Python_openpyxl处理Excel表格
- Python+sqlmap
- python+opencv cv2.VideoCapture获取视频失败 解决方法