一、定制类
重写python内置的函数、异常、对象。
__str__()和__repr__()
类似于Java里的toString()
class Dog(object):
def __str__(self):
return "汪汪汪"
>>>dog=Dog()
>>>print(dog)
汪汪汪
但是,不加print
,直接输入dog
:
>>> dog
<__main__.Dog object at 0x0000021069502160>
这时,我们要用到__repr__()
了:
class Dog(object):
def __repr__(self):
return "汪汪汪"
>>>dog=Dog()
>>>print(dog)
汪汪汪
>>>dog
汪汪汪
__str__()
用于显示给用户,而__repr__()
用于显示给开发人员。
__str__
和__repr__
函数会被子类继承。
__iter__()和__next__()
遍历对象
类似list或tuple那样,就必须实现一个__iter__()
方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()
方法拿到循环的下一个值,直到遇到StopIteration
错误时退出循环。
class Language(object): def __init__(self): self.count = 0
def __iter__(self): return self # 实例本身就是迭代对象,故返回自己 def __next__(self): self.count += 1 if self.count > 3: raise StopIteration() return self.countlanguage = Language() for i in language: print(i) 1 2 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
这样,就可以按照下标访问数列了:
>>> f = Fib()
>>> f[1]
1
>>> f[10]
89
>>> f[100]
573147844013817084101
类似于list的切片方法:
__getitem__()
传入的参数可能是一个int
,也可能是一个切片对象slice
,所以要做判断:
class Fib(object):
def __getitem__(self, n):
if isinstance(n, int): # n是索引
a, b = 1, 1
for x in range(n):
a, b = b, a + b
return a
if isinstance(n, slice): # n是切片
start = n.start
stop = n.stop
if start is None:
start = 0
a, b = 1, 1
L = []
for x in range(stop):
if x >= start:
L.append(a)
a, b = b, a + b
return L
实现效果:
>>> f = Fib()
>>> f[0:5]
[1, 1, 2, 3, 5]
此外,如果把对象看成dict
,__getitem__()
的参数也可能是一个可以作key
的object
,例如str
。
__setitem__()
给某个元素赋值
__delitem__()
删除某个元素
__getattr__()
当调用不存在的属性时,才会去调用它
class Student(object):
def __getattr__(self, attr):
if attr=='score':
return 99
Student
类中没有score
这个属性,所以去调用__getattr__
>>> s = Student()
>>> s.score
99
也可以返回函数:
def __getattr__(self, attr):
if attr=='age':
return lambda: 25
如果__getattr__
中也找不到这个属性,默认返回'None'。
__call__()
把类实例变成可调用对象,模糊了对象和函数的概念
class Student(object): def __init__(self, name): self.name = name
def __call__(self): print('My name is %s.' % self.name) >>> s = Student('Michael') >>> s() # self参数不要传入 My name is Michael.
如果一个对象能被调用,我们就称之为Callable
对象,比如上面带有call()
的类实例:
>>> callable(Student())
True
>>> callable(max)
True
>>> callable([1, 2, 3])
False
>>> callable(None)
False
>>> callable('str')
False
通过callable()
函数,我们就可以判断一个对象是否是“可调用”对象。
其它博客链接: