अजगर में एक वर्ग का विस्तार कैसे करें?


92

अजगर में आप एक वर्ग का विस्तार कैसे कर सकते हैं? उदाहरण के लिए अगर मेरे पास है

color.py

class Color:
    def __init__(self, color):
        self.color = color
    def getcolor(self):
        return self.color

color_extended.py

import Color

class Color:
    def getcolor(self):
        return self.color + " extended!"

But this doesn't work... I expect that if I work in color_extended.py, then when I make a color object and use the getcolor function then it will return the object with the string " extended!" in the end. Also it should have gotton the init from the import.

Assume python 3.1

धन्यवाद


2
क्या आपने दस्तावेज़ पढ़ने की कोशिश की? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR

कक्षाओं में पहले अक्षर का कैपिटल होना चाहिए ("रंग" नहीं "रंग");)
daveoncode

14
2013 में @WRAR शायद यह एक उचित सवाल है, लेकिन चलो ईमानदार हो - लोग पहले StackOverflow की ओर रुख करते हैं, इसलिए यह SO पर एक अच्छा सवाल है। यह सवाल "अजगर विस्तार वर्ग" के लिए पहला Google हिट है, प्रलेखन तीसरा है।
टीसी प्रॉक्टर

जवाबों:


94

उपयोग:

import color

class Color(color.Color):
    ...

यदि यह अजगर 2.x थे, तो आप भी प्राप्त करने के लिए चाहते हो जाएगा color.Colorसे object, यह एक बनाने के लिए नई शैली वर्ग :

class Color(object):
    ...

यह पायथन 3.x में आवश्यक नहीं है।


31
यह ध्यान देने योग्य है कि आप नए वर्ग को पुराने नाम के समान नाम दे सकते हैं: class color(color):एक नए वर्ग को परिभाषित करता है जो पुराने को बदल देता है, लेकिन जो इससे प्राप्त होता है। (ऐसा प्रतीत होता है कि ओपी क्या करने की कोशिश कर रहा है।)
टाइप करें

17
class extended_color(color):आमतौर पर खराब मानक है - class ExtendedColor(Color):कक्षाओं के लिए होना चाहिए। सिर्फ एक
निपिक

Noob यहाँ सवाल: आप का उपयोग क्यों नहीं किया __init__?
मेंटलिस्ट

0

विस्तारित करने का एक अन्य तरीका (विशेष रूप से अर्थ है, नए तरीके जोड़ें, मौजूदा वाले नहीं बदलें) कक्षाएं, यहां तक ​​कि अंतर्निहित भी, एक प्रीप्रोसेसर का उपयोग करना है जो पायथन के दायरे से बाहर / ऊपर विस्तार करने की क्षमता जोड़ता है, विस्तार को परिवर्तित करना पाइथन से पहले सामान्य पायथन सिंटैक्स वास्तव में इसे देखने के लिए मिलता है।

str()उदाहरण के लिए, मैंने पायथन 2 की कक्षा का विस्तार करने के लिए ऐसा किया है । str()इस तरह के रूप में उद्धृत किया आंकड़ों के अंतर्निहित संबंध की वजह से एक विशेष रूप से दिलचस्प लक्ष्य है 'this'और 'that'

यहाँ कुछ विस्तार कोड है, जहाँ केवल जोड़ा गया गैर-पायथन सिंटैक्स है extend:testDottedQuad:

extend:testDottedQuad
def testDottedQuad(strObject):
    if not isinstance(strObject, basestring): return False
    listStrings = strObject.split('.')
    if len(listStrings) != 4: return False
    for strNum in listStrings:
        try:    val = int(strNum)
        except: return False
        if val < 0: return False
        if val > 255: return False
    return True

जिसके बाद मैं प्रीप्रोसेसर को खिलाए गए कोड में लिख सकता हूं:

if '192.168.1.100'.testDottedQuad():
    doSomething()

dq = '216.126.621.5'
if not dq.testDottedQuad():
    throwWarning();

dqt = ''.join(['127','.','0','.','0','.','1']).testDottedQuad()
if dqt:
    print 'well, that was fun'

प्रीप्रोसेसर ने वह खाया, जो बिना पैंक्रिया के सामान्य पाइथन को थूक देता है, और पाइथन वही करता है जो मैंने करने का इरादा किया था।

जिस तरह ac प्रीप्रोसेसर c में कार्यक्षमता जोड़ता है, उसी प्रकार Python प्रीप्रोसेसर भी Python में कार्यक्षमता जोड़ सकता है।

मेरे पूर्वप्रक्रमक कार्यान्वयन एक ढेर अतिप्रवाह उत्तर के लिए बहुत बड़ी है, लेकिन जो लोग रुचि हो सकती है के लिए, यह है यहाँ GitHub पर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.