Come estendere una classe in Python?


92

In Python come puoi estendere una classe? Ad esempio, se ho

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!"

Ma questo non funziona ... Mi aspetto che se ci lavoro color_extended.py, quando creo un oggetto a colori e uso la getcolorfunzione, restituirà l'oggetto con la stringa "extended!" alla fine. Inoltre dovrebbe avere gotton l'init dall'importazione.

Supponiamo che Python 3.1

Grazie


2
Hai provato a leggere la documentazione? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR

le classi dovrebbero avere la prima lettera in maiuscolo ("Color" non "color");)
daveoncode

14
@wRAR Forse nel 2013 questa è una domanda ragionevole, ma siamo onesti: le persone si rivolgono prima a StackOverflow, quindi questa è una buona domanda da avere su SO. Questa domanda è il primo successo di Google per "Python Extendi Class", la documentazione è la terza.
TC Proctor

Risposte:


94

Uso:

import color

class Color(color.Color):
    ...

Se questo fosse Python 2.x, dovresti anche derivare color.Colorda object, per renderlo una classe di nuovo stile :

class Color(object):
    ...

Questo non è necessario in Python 3.x.


31
Vale la pena notare che puoi dare alla nuova classe lo stesso nome di quella vecchia: class color(color):definisce una nuova classe che sostituisce quella vecchia, ma che è derivata da essa. (Questo sembra essere ciò che l'OP sta cercando di fare.)
meno il

17
class extended_color(color):di solito sono cattivi standard - class ExtendedColor(Color):dovrebbe essere per le classi. Solo un pignolo
TyrantWave

Noob domanda qui: perché non l'hai usato __init__?
Mentalist

0

Un altro modo per estendere (in particolare significa, aggiungere nuovi metodi, non modificare quelli esistenti) le classi, anche quelle incorporate, è usare un preprocessore che aggiunge la capacità di estendersi al di fuori / al di sopra dell'ambito di Python stesso, convertendo l'estensione in normale sintassi di Python prima che Python riesca effettivamente a vederla.

L'ho fatto per estendere la str()classe di Python 2 , ad esempio. str()è un target particolarmente interessante a causa del collegamento implicito a dati citati come 'this'e 'that'.

Ecco un po 'di codice di estensione, in cui l'unica sintassi non Python aggiunta è il extend:testDottedQuadbit:

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

Dopodiché posso scrivere nel codice fornito al preprocessore:

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'

Il preprocessore lo mangia, sputa il normale Python senza monkeypatching e Python fa quello che volevo che facesse.

Proprio come un preprocessore ac aggiunge funzionalità a c, così anche un preprocessore Python può aggiungere funzionalità a Python.

L'implementazione del mio preprocessore è troppo grande per una risposta di overflow dello stack, ma per coloro che potrebbero essere interessati, è qui su GitHub.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.