Pyhton学习 常见定制类
前言
一、Python常见定制类有哪些?
看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。__slots_,__len__还有很多常见的定制类。
二、使用定制类
1.__str__
#定制类
class Student(object):
def __init__(self,name):
self.name = name
def __str__(self):
return f'student name is {self.name} and age is {self.age}'
2.__iter__
如果一个类想被用于for … in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
#婓契那波数列例子
#iter
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 > 100:
raise StopIteration()
return self.a
for n in Fib():
print(n)
3.__getitem__
#实现下标获取元素值
class Fib(object):
def __getitem__(self,n):
a,b = 1,1
for x in range(n):
a,b = b,a + b
return a
#如果是切片获取则还要判断
class Fib(object):
def __getitem__(self,n):
if(isinstance(n,int)):
a,b=1,1
for i in range(n):
a,b = b,a+b
return a
elif(isinstance(n,slice)):
start = n.start
stop = n.stop
if(start is None):
start = 0
a,b = 1,1
list = []
for i in range(stop):
a,b = b,a+b
if(i >= start):
list.append(a)
return list
else:
raise TypeError('数值下标必须是整数或者切片')
4.__getattr__
如果不存在某个值时,是会报错的
class Student(object):
def __getattr__(self,attr):
if(attr == 'score'):
return 99
#这里也可以用匿名返回函数 lambda: 99
raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr)
5.__call__
一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在Python中,答案是肯定的。
任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。请看示例:
class callExample(object):
def __call__(self):
print("callExample is called")
c = callExample()
c()
那么,怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call__()的类实例:
callable(Student())
True
callable(max)
True
callable([1, 2, 3])
False
callable(None)
False
callable(‘str’)
False
通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。
总结
Python的class允许定义许多定制方法,可以让我们非常方便地生成特定的类。
本节介绍的是最常用的几个定制方法,还有很多可定制的方法,请参考Python的官方文档。

被折叠的 条评论
为什么被折叠?



