เช่นผมมี main.py อยู่ที่ . แล้วมี plugins ต่่างๆ ที่อยากให้ถูกโหลดขึ้นมาอยู่ที่ ./mylibs/ ใน mylib มี
__init__.py plugin_interface.py simple_plugin.py simple_plugin2.py
code ของ plugin_interface.py
class PluginInterface(object):
def __init__(self):
pass
def getInfo(self,inputData):
raise NotImplementedError
(ใช้ไม่ได้ก็เชิญดุด่าว่ากล่าวได้เลยครับ)
code ของ simple_plugin.py
from mylib.PluginInterface import PluginInterface
class SimplePlugin(PluginInterface):
def __init__(self):
PluginInterface.__init__(self)
def getInfo(self,inputData):
print "Your output from plugin1 is",type(inputData)
code ของ simple_plugin2.py
from mylib.PluginInterface import PluginInterface
class SimplePlugin2(PluginInterface):
def __init__(self):
PluginInterface.__init__(self)
def getInfo(self,inputData):
print "Your output from plugin2 is",inputData+inputData
main.py(ไม่อัตโนมัติ ต้อง import ใหม่หมด)
from mylib.simple_plugin import SimplePlugin
from mylib.simple_plugin2 import SimplePlugin2
plugins = [] plugins.append(SimplePlugin()) plugins.append(SimplePlugin2()) for plugin in plugins: plugin.getInfo(1)
output
Your output from plugin1 is
Your output from plugin2 is 2
ผมควรจะเขียน main.py อย่างไรถ้าเกิดว่าผมมี simple3_plugin.py ขึ้นมา โดยที่ไม่ต้องคอยมาเพิ่ม code ใน main พอมีทางเป็นไปได้หรือเปล่าครับ หรือว่าถ้าผมออกแบบมานี่มันเป็นไปไม่ได้ควรจะแก้ไขยังไงดีครับ
ลองดูตัวอ
hereblur Tue, 16/09/2008 - 17:08
ลองดูตัวอย่างนี้นะครับ ไม่ต้อง import ก่อน
main.py
import imp
plug_ins_list = ["plugin1.MyPlugIn1", "plugin2.MyPlugIn2"]
class main :
def init(self) :
self.plugins = []
m = main()
for p in plug_ins_list :
m.loadPlugin(p)
m.action()
plugin1.py
class MyPlugIn1 :
def init(self) :
pass
plugin2.py
class MyPlugIn2 :
def init(self) :
pass
น่าจะได้น
mossila Tue, 16/09/2008 - 17:59
In reply to ลองดูตัวอ by hereblur
น่าจะได้นะครับขอบคุณครับ แบบนี้ถ้าเราแยก
plug_ins_list = ["plugin1.MyPlugIn1", "plugin2.MyPlugIn2"]ออกมาเป็น config file เราก็แค่ 1. เพิ่ม file plugin เข้าไปที่ directory ที่เราจะเก็บ plug in 2. แก้ไข ไฟล์ config เพิ่มชื่อ plug-in เข้าไป
ทำนองนั้นใช่มั้ยครับ
ปล. python มี interface class หรือเปล่าครับ(หรือว่าควรไปตั้งกระทู้ใหม่) ปล.2 ถ้ามีแล้วทำยังไงหรือครับ ใช้เผื่อกำหนดให้ plug-in ต้องมี method action เหมือนในที่นี้น่ะครับ
อย่าเข้าไปอ่านนะ บทความของ Rookieinterface class
bow_der_kleine Wed, 17/09/2008 - 00:07
In reply to น่าจะได้น by mossila
interface class คืออะไรอะ ? เพิ่งได้ยินเป็นครั้งแรกครับ
นี่คือปัญหาอย่างหนึ่งของการเปลี่ยนภาษาเขียนโปรแกรมครับ คือ เราจะชอบคิดในรูปแบบภาษาเขียนโปรแกรมที่เรารู้จักอยู่แล้ว ใน Python ทุกอย่างเป็น dynamic ครับ ดังนั้น interface จึงไม่ค่อยมีประโยชน์ ยกตัวอย่าง
class PluginInterface(object):
def __init__(self):
pass
def getInfo(self,inputData):
raise NotImplementedError
จะไม่ค่อยเจอใน python ครับ เพราะไม่มีหน้าที่อะไร นอกจากตรวจสอบว่า sub class มีเมโธท getInfo หรือเปล่า ซึ่งหาก class ที่เราสร้างขึ้น ไม่ได้มี super class เป็น PluginInterface ทุกอย่างก็จบ ซึ่งการแก้ปัญหาเรื่องคลาสต้องมีเมโธทที่กำหนด ผมคิดว่าใช้ try, except ตอนเรียกปลั้กอินน่าจะดีกว่า
try :
plugin.action()
except AttributeError :
print 'Hey, your plugin needs method action()!'
BioLawCom.De
โอเป็น
mossila Wed, 17/09/2008 - 01:21
In reply to interface class by bow_der_kleine
โอเป็น ความรู้ใหม่ ขอบคุงครับ
อย่าเข้าไปอ่านนะ บทความของ Rookie
interface class
mossila Wed, 17/09/2008 - 01:32
In reply to interface class by bow_der_kleine
interface class นี่อยู่ในเรื่อง OO programing มังครับ หรือว่าผมเข้าใจผิด แต่มันเป็นคุณสมบัติหนึ่งในภาษา java น่ะครับ
อย่าเข้าไปอ่านนะ บทความของ Rookie
Interface Class และ
hereblur Wed, 17/09/2008 - 10:55
In reply to interface class by mossila
Interface Class และ Abstract Class เป็นเพียงตัวช่วยให้การเขียน OOP ง่ายขึ้นครับ เวลา implement ระบบใหญ่ ๆ เขียนหลาย ๆ คน มีเฉพาะบางภาษา เช่น Java ,C#
แต่ไม่ใช่สิ่งที่จำเป็นต้องมี ใน Python ก็เลยไม่มี เพราะต้องการความยืดหยุ่นมากกว่า อย่างที่คุณ bow_der_kleine ว่าไว้
โอขอบคุณค
mossila Wed, 17/09/2008 - 11:30
In reply to Interface Class และ by hereblur
โอขอบคุณครับ ที่แนะนำ
เพิ่งเขียนได้ไม่นานนี้เองน่ะครับยังมีหลายๆอย่างที่ยังไม่ค่อยเข้าใจ ^-^
อย่าเข้าไปอ่านนะ บทความของ Rookie