ผมพบว่าเป็นสถานที่ที่ดีที่จะใช้วัตถุ callable, ที่กำหนด__call__()
คือเมื่อใช้ความสามารถในการเขียนโปรแกรมการทำงานในหลามเช่นmap()
, , filter()
reduce()
เวลาที่ดีที่สุดในการใช้วัตถุที่เรียกได้ผ่านฟังก์ชั่นธรรมดาหรือฟังก์ชั่นแลมบ์ดาคือเมื่อตรรกะมีความซับซ้อนและจำเป็นต้องรักษาสถานะไว้หรือใช้ข้อมูลอื่นที่ไม่ผ่านไปยัง__call__()
ฟังก์ชั่น
นี่คือรหัสบางอย่างที่กรองชื่อไฟล์ขึ้นอยู่กับนามสกุลของไฟล์ของพวกเขาโดยใช้วัตถุที่ callable filter()
และ
callable:
import os
class FileAcceptor(object):
def __init__(self, accepted_extensions):
self.accepted_extensions = accepted_extensions
def __call__(self, filename):
base, ext = os.path.splitext(filename)
return ext in self.accepted_extensions
class ImageFileAcceptor(FileAcceptor):
def __init__(self):
image_extensions = ('.jpg', '.jpeg', '.gif', '.bmp')
super(ImageFileAcceptor, self).__init__(image_extensions)
การใช้งาน:
filenames = [
'me.jpg',
'me.txt',
'friend1.jpg',
'friend2.bmp',
'you.jpeg',
'you.xml']
acceptor = ImageFileAcceptor()
image_filenames = filter(acceptor, filenames)
print image_filenames
เอาท์พุท:
['me.jpg', 'friend1.jpg', 'friend2.bmp', 'you.jpeg']