มีรูปแบบที่ฉันเรียนรู้จากรหัส Twisted Python
class SMTP:
def lookupMethod(self, command):
return getattr(self, 'do_' + command.upper(), None)
def do_HELO(self, rest):
return 'Howdy ' + rest
def do_QUIT(self, rest):
return 'Bye'
SMTP().lookupMethod('HELO')('foo.bar.com') # => 'Howdy foo.bar.com'
SMTP().lookupMethod('QUIT')('') # => 'Bye'
คุณสามารถใช้งานได้ทุกเมื่อที่คุณต้องการส่งไปยังโทเค็นและเรียกใช้โค้ดเพิ่มเติม ในเครื่องของรัฐที่คุณจะมีวิธีการและจัดส่งได้ที่state_
self.state
สวิตช์นี้สามารถขยายได้อย่างหมดจดโดยสืบทอดจากคลาสฐานและกำหนดdo_
วิธีการของคุณเอง บ่อยครั้งที่คุณไม่มีdo_
วิธีการในคลาสพื้นฐาน
แก้ไข: ใช้งานอย่างไร
ในกรณีของ SMTP คุณจะได้รับHELO
จากสาย รหัสที่เกี่ยวข้อง (จากtwisted/mail/smtp.py
ปรับเปลี่ยนสำหรับกรณีของเรา) มีลักษณะเช่นนี้
class SMTP:
# ...
def do_UNKNOWN(self, rest):
raise NotImplementedError, 'received unknown command'
def state_COMMAND(self, line):
line = line.strip()
parts = line.split(None, 1)
if parts:
method = self.lookupMethod(parts[0]) or self.do_UNKNOWN
if len(parts) == 2:
return method(parts[1])
else:
return method('')
else:
raise SyntaxError, 'bad syntax'
SMTP().state_COMMAND(' HELO foo.bar.com ') # => Howdy foo.bar.com
คุณจะได้รับ' HELO foo.bar.com '
(หรือคุณอาจได้รับ'QUIT'
หรือ'RCPT TO: foo'
) นี้จะ tokenized เข้าเป็นparts
ชื่อวิธีการค้นหาที่เกิดขึ้นจริงจะนำมาจาก['HELO', 'foo.bar.com']
parts[0]
(วิธีการดั้งเดิมเรียกอีกอย่างว่าstate_COMMAND
เพราะมันใช้รูปแบบเดียวกันในการใช้เครื่องสถานะเช่นgetattr(self, 'state_' + self.mode)
)