Wie kann man eine Klasse in Python erweitern?

90

Wie können Sie in Python eine Klasse erweitern? Zum Beispiel, wenn ich habe

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

Aber das funktioniert nicht ... Ich gehe davon aus, dass wenn ich arbeite color_extended.py, wenn ich ein Farbobjekt erstelle und die getcolorFunktion verwende, das Objekt mit der Zeichenfolge "erweitert!" Zurückgegeben wird. schlussendlich. Außerdem sollte es den Init vom Import bekommen haben.

Angenommen, Python 3.1

Vielen Dank

Omega
quelle
2
Haben Sie versucht, die Dokumentation zu lesen? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR
Klassen sollten den ersten Buchstaben groß geschrieben haben ("Farbe" nicht "Farbe");)
Daveoncode
12
@wRAR Vielleicht ist dies 2013 eine vernünftige Frage, aber seien wir ehrlich - die Leute wenden sich zuerst an StackOverflow, also ist dies eine gute Frage zu SO. Diese Frage ist der erste Google-Treffer für "Python Extend Class", die Dokumentation ist die dritte.
TC Proctor

Antworten:

92

Verwenden:

import color

class Color(color.Color):
    ...

Wenn dieser Python 2.x waren, würden Sie auch ableiten color.Coloraus object, es zu machen , neue Stil - Klasse :

class Color(object):
    ...

Dies ist in Python 3.x nicht erforderlich.

NPE
quelle
31
Es ist erwähnenswert, dass Sie der neuen Klasse den gleichen Namen wie der alten geben können: class color(color):Definiert eine neue Klasse, die die alte ersetzt, aber von dieser abgeleitet ist. (Dies scheint das zu sein, was das OP versucht.)
Kindall
16
class extended_color(color):ist in der Regel schlechte Standards - class ExtendedColor(Color):sollte für Klassen sein. Nur ein Trottel
TyrantWave
0

Eine andere Möglichkeit, Klassen zu erweitern (insbesondere neue Methoden hinzuzufügen, vorhandene nicht zu ändern), auch integrierte Klassen, besteht darin, einen Präprozessor zu verwenden, der die Möglichkeit bietet, den Bereich von Python selbst zu erweitern und zu erweitern und die Erweiterung in zu konvertieren normale Python-Syntax, bevor Python sie tatsächlich sieht.

Ich habe dies str()zum Beispiel getan, um die Klasse von Python 2 zu erweitern . str()ist ein besonders interessantes Ziel aufgrund der impliziten Verknüpfung mit zitierten Daten wie 'this'und 'that'.

Hier ist ein erweiterter Code, bei dem die einzige hinzugefügte Nicht-Python-Syntax das extend:testDottedQuadBit ist:

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

Danach kann ich den Code eingeben, der dem Präprozessor zugeführt wird:

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'

Der Präprozessor isst das, spuckt normales Python ohne Monkeypatching aus und Python macht das, was ich beabsichtigt habe.

So wie ein AC-Präprozessor c Funktionen hinzufügt, kann auch ein Python-Präprozessor Python Funktionen hinzufügen.

Meine Präprozessor-Implementierung ist zu groß für eine Stapelüberlauf-Antwort, aber für diejenigen, die interessiert sein könnten, ist sie hier auf GitHub.

Fyngyrz
quelle