__call__
()__call__
(self, [args …]) 它接受一系列参数。假设x是类X的一个实例 , x.__call__
(1, 2) 就等价于调用x(1,2),而实例x仿佛就是一个函数。__call__
()的上述特性,可以允许开发者使用OO的方式来创建易用的API__call__
()方法,那么该实例也是callable的。下面的例子演示了如何使用类的__call__
()方法来定义一组通用API,代码来自stackoverflow网站。
# filehash.py
import hashlib
class Hasher(object):
"""
A wrapper around the hashlib hash algorithms that allows an entire file to
be hashed in a chunked manner.
"""
def __init__(self, algorithm):
self.algorithm = algorithm
def __call__(self, file):
hash = self.algorithm()
with open(file, 'rb') as f:
for chunk in iter(lambda: f.read(4096), ''):
hash.update(chunk)
return hash.hexdigest()
md5 = Hasher(hashlib.md5)
sha1 = Hasher(hashlib.sha1)
sha224 = Hasher(hashlib.sha224)
sha256 = Hasher(hashlib.sha256)
sha384 = Hasher(hashlib.sha384)
sha512 = Hasher(hashlib.sha512)
下面是调用这些API
from filehash import sha1
print sha1('somefile.txt')
本文地址已经归档到github,您可以访问下面的链接获得。
代码地址
如果觉得本文对您有帮助,敬请点赞。