प्लगइन सिस्टम के लिए एक और दृष्टिकोण के रूप में, आप एक्स्टेंड मी प्रोजेक्ट की जांच कर सकते हैं ।
उदाहरण के लिए, चलिए सरल वर्ग और उसके विस्तार को परिभाषित करते हैं
# Define base class for extensions (mount point)
class MyCoolClass(Extensible):
my_attr_1 = 25
def my_method1(self, arg1):
print('Hello, %s' % arg1)
# Define extension, which implements some aditional logic
# or modifies existing logic of base class (MyCoolClass)
# Also any extension class maby be placed in any module You like,
# It just needs to be imported at start of app
class MyCoolClassExtension1(MyCoolClass):
def my_method1(self, arg1):
super(MyCoolClassExtension1, self).my_method1(arg1.upper())
def my_method2(self, arg1):
print("Good by, %s" % arg1)
और इसका उपयोग करने का प्रयास करें:
>>> my_cool_obj = MyCoolClass()
>>> print(my_cool_obj.my_attr_1)
25
>>> my_cool_obj.my_method1('World')
Hello, WORLD
>>> my_cool_obj.my_method2('World')
Good by, World
और दिखाओ कि दृश्य के पीछे क्या छिपा है:
>>> my_cool_obj.__class__.__bases__
[MyCoolClassExtension1, MyCoolClass]
extend_me metaclasses के माध्यम से पुस्तकालय manipulates वर्ग बनाने की प्रक्रिया है, इस प्रकार के उदाहरण में ऊपर, नया उदाहरण बनाते समय की MyCoolClass
हम नए वर्ग के उदाहरण दोनों की उपवर्ग है कि मिल गया है MyCoolClassExtension
और MyCoolClass
पायथन के लिए उन दोनों के होने कार्यक्षमता, धन्यवाद एकाधिक वंशानुक्रम
वर्ग निर्माण पर बेहतर नियंत्रण के लिए इस परिवाद में परिभाषित कुछ मेटाक्लस हैं:
ExtensibleType
- उपवर्ग द्वारा सरल विस्तार की अनुमति देता है
ExtensibleByHashType
- एक्सटेंसिबल टाइप के समान, लेकिन क्लास के विशेष संस्करणों के निर्माण की क्षमता, बेस क्लास के वैश्विक विस्तार और क्लास के विशेष संस्करणों के विस्तार की अनुमति
इस lib का उपयोग OpenERP प्रॉक्सी प्रोजेक्ट में किया जाता है , और लगता है कि यह काफी अच्छा काम कर रहा है!
उपयोग के वास्तविक उदाहरण के लिए, OpenERP प्रॉक्सी 'field_datetime' एक्सटेंशन में देखें :
from ..orm.record import Record
import datetime
class RecordDateTime(Record):
""" Provides auto conversion of datetime fields from
string got from server to comparable datetime objects
"""
def _get_field(self, ftype, name):
res = super(RecordDateTime, self)._get_field(ftype, name)
if res and ftype == 'date':
return datetime.datetime.strptime(res, '%Y-%m-%d').date()
elif res and ftype == 'datetime':
return datetime.datetime.strptime(res, '%Y-%m-%d %H:%M:%S')
return res
Record
यहाँ विलुप्त वस्तु है। RecordDateTime
विस्तार है।
एक्सटेंशन को सक्षम करने के लिए, बस इंपोर्ट मॉड्यूल जिसमें एक्सटेंशन क्लास है, और (ऊपर मामले में) इसके Record
बाद बनाई गई सभी ऑब्जेक्ट बेस क्लास में एक्सटेंशन क्लास होगी, इस प्रकार इसकी सभी कार्यक्षमता होगी।
इस लाइब्रेरी का मुख्य लाभ यह है कि, कोड जो एक्स्टेंसिबल ऑब्जेक्ट्स को संचालित करता है, उसे एक्सटेंशन के बारे में जानने की आवश्यकता नहीं होती है और एक्सटेंशन एक्सटेंसिबल ऑब्जेक्ट्स में सब कुछ बदल सकता है।