2012-06-09 23 views
7

का उपयोग कर चेनिंग विधियों [] (__getitem__) पाइथन ऑपरेटर और प्रारंभिक स्मृति संदर्भ का उपयोग कर श्रृंखला विधियों को अधिभारित करना संभव है।अधिभार [] पायथन ऑपरेटर और मेमोरी संदर्भ

कल्पना कीजिए कि मैं इस तरह, एक वर्ग Math कि पूर्णांक संख्याओं की सूची को स्वीकार करता है:

class Math(object): 
    def __init__(self, *args, **kwargs): 
     assert(all([isinstance(item, int) for item in list(args)])) 
     self.list = list(args) 

    def add_one(self): 
     for index in range(len(self.list)): 
      self.list[index] += 1 

और मैं इस तरह कुछ करना चाहता हूँ:

instance = Math(1,2,3,4,5) 
instance[2:4].add_one() 

इस कोड instance.list चाहिए क्रियान्वित करने के बाद [1,2,4,5,5] हो, क्या यह संभव है?

मुझे पता है कि मैं add_one(2,4) जैसे कुछ कर सकता हूं, लेकिन यह एपीआई की शैली नहीं है जिसे मैं संभव बनाना चाहता हूं।

धन्यवाद

उत्तर

9

विंस्टन का उल्लेख किया है, आप एक सहायक वस्तु को लागू करने की जरूरत है: क्या आप अर्थ विज्ञान होना चाहता हूँ पर

class Math(object): 
    def __init__(self, *args, **kwargs): 
     self.list = list(args) 

    def __getitem__(self, i): 
     return MathSlice(self, i) 

class MathSlice(object): 
    def __init__(self, math, slice): 
     self.math = math 
     self.slice = slice 

    def add_one(self): 
     for i in xrange(*self.slice.indices(len(self.math.list))): 
      self.math.list[i] += 1 


instance = Math(1,2,3,4,5) 
instance[2:4].add_one() 

print instance.list 

कैसे आप MathSlice वस्तु के साथ गणित वस्तु का हिस्सा निर्भर करता है कि गणित वस्तु परिवर्तन।

+0

'xrange (* self.slice.indices (लेन (self.math.list))) 'बहुत अजीब लगता है। क्या कोई बेहतर तरीका है? – Eric

+0

इसके अलावा, आप 'self.fields' और' self.list' – Eric

+0

@Eric मिश्रण कर रहे हैं: मैंने अनियंत्रित Math.add_one को हटा दिया है, और हाँ कि xrange (* ...) बहुत बोझिल लगता है, लेकिन मुझे नहीं पता एक छोटा रास्ता –

5

न्यूम्पी ऐसा कुछ करता है।

__getitem__ विधि slice ऑब्जेक्ट प्राप्त करेगी। विवरण के लिए http://docs.python.org/reference/datamodel.html देखें। आपको एक नई वस्तु वापस करने की आवश्यकता होगी, लेकिन उस ऑब्जेक्ट को कार्यान्वित करें जैसे कि यह मूल सूची को संशोधित करता है।

+0

धन्यवाद आपके लिए विंस्टन धन्यवाद। मैं नेड के जवाब को स्वीकार कर रहा हूं, क्योंकि वह अधिक कार्यान्वयन विवरण दे रहा है और मुझे लगता है कि अन्य उपयोगकर्ताओं को यह और अधिक उपयोगी लगेगा। लेकिन मैं आपके जवाब की सराहना करता हूं। – maraujop

संबंधित मुद्दे