python - tutorial - पायथन में आधार कक्षाओं को विस्तारित करना




python tutorial (3)

इनट अपरिवर्तनीय हैं और आप इन्हें जगह में संशोधित नहीं कर सकते हैं, इसलिए आपको विकल्प # 2 के साथ जाना चाहिए (क्योंकि विकल्प # 1 कुछ चालान के बिना असंभव है)

मैं पायथन में कुछ "आधार" वर्गों का विस्तार करने की कोशिश कर रहा हूं:

class xlist (list):
    def len(self):
        return len(self)

    def add(self, *args):
        self.extend(args)
        return None


class xint (int):
    def add(self, value):
        self += value
        return self


x = xlist([1,2,3])
print x.len()   ## >>> 3 ok
print x         ## >>> [1,2,3] ok
x.add (4, 5, 6)
print x         ## >>> [1,2,3,4,5,6] ok

x = xint(10)
print x         ## >>> 10 ok
x.add (2)
print x         ## >>> 10  # Not ok (#1)

print type(x)         ## >>> <class '__main__.xint'> ok
x += 5
print type(x)         ## >>> <type 'int'>  # Not ok (#2)

यह सूची मामले में ठीक काम करता है क्योंकि ऐपेंड विधि ऑब्जेक्ट को "जगह" में बदल देती है, बिना इसे लौटाए। लेकिन int मामले में, ऐड मेथड बाहरी एक्स वैरिएबल के वैल्यू को संशोधित नहीं करता है। मुझे लगता है कि यह अर्थ में ठीक है कि स्वयं क्लास के ऐड मेथड में एक स्थानीय वैरिएबल है, लेकिन यह मुझे क्लास के उदाहरण को आवंटित प्रारंभिक मान को संशोधित करने से रोक रहा है।

क्या इस वर्ग को इस प्रकार बढ़ाया जा सकता है या क्या मुझे आधार प्रकार के साथ एक वर्ग की संपत्ति को परिभाषित करना चाहिए और इस संपत्ति के सभी आवश्यक तरीकों को मैप करना चाहिए?


int एक वैल्यू टाइप है, इसलिए हर बार जब आप असाइनमेंट करते हैं, (उदाहरण के लिए + = ऊपर के सभी उदाहरण), यह ढेर पर आपके ऑब्जेक्ट को संशोधित नहीं करता है, लेकिन संदर्भ को दाहिने हाथ के परिणाम में से एक के साथ बदल देता है असाइनमेंट की ओर (यानी एक पूर्णांक)

सूची कोई मूल्य प्रकार नहीं है, इसलिए यह समान नियमों से बाध्य नहीं है

इस पृष्ठ में अंतर पर अधिक विवरण है: http://docs.python.org/ref/objects.html

आईएमओ, हां, आपको एक नया वर्ग परिभाषित करना चाहिए जो एक इंट को आवृत्ति चर के रूप में रखता है


मैंने आपको एक्सलिस्ट क्लास को सिर्फ थोड़ी ही बढ़ाया है, इसे बनाया है ताकि आप उसे एक संख्या के सभी सूचक अंक मिल सकें ताकि आप कई सूचियों के साथ विस्तार कर सकें, एक बार इसे आरंभ और इसे बनाकर आप इसके माध्यम से दोहरा सकते हैं

class xlist:
    def __init__(self,alist):
        if type(alist)==type(' '):
            self.alist = [int(i) for i in alist.split(' ')]
        else:
            self.alist = alist
    def __iter__(self):
        i = 0
        while i<len(self.alist):
            yield self.alist[i]
            i+=1
    def len(self):
        return len(self.alist)
    def add(self, *args):
        if type(args[0])==type([1]):
            if len(args)>1:
                tmp = []
                [tmp.extend(i) for i in args]
                args = tmp
            else:args = args[0]
        if type(args)==type(''):args = [int(i) for i in args.split(' ')] 
        (self.alist).extend(args)
        return None
    def index(self,val):
        gen = (i for i,x in enumerate(self.alist) if x == val)
        return list(gen)




python