138 votes

Comment étendre une classe en python ?

En python, comment peut-on étendre une classe ? Par exemple, si j'ai

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

Mais cela ne fonctionne pas... Je m'attends à ce que si je travaille dans color_extended.py puis, lorsque je crée un objet couleur et que j'utilise la fonction getcolor alors il retournera l'objet avec la chaîne " extended !" à la fin. De plus, il aurait dû obtenir l'init de l'import.

Supposons que python 3.1

137voto

NPE Points 169956

Utilisez :

import color

class Color(color.Color):
    ...

S'il s'agissait de Python 2.x, vous voudriez aussi dériver color.Color de object pour en faire un cours nouveau style :

class Color(object):
    ...

Cela n'est pas nécessaire dans Python 3.x.

21voto

aexl Points 1718
class MyParent:

    def sayHi():
        print('Mamma says hi')

from path.to.MyParent import MyParent

class ChildClass(MyParent):
    pass

Une instance de ChildClass héritera alors de la sayHi() méthode.

4voto

fyngyrz Points 325

Une autre façon d'étendre (c'est-à-dire d'ajouter de nouvelles méthodes, et non de modifier les méthodes existantes) des classes, même celles qui sont intégrées, consiste à utiliser un préprocesseur qui ajoute la possibilité d'étendre hors du champ d'application de Python lui-même, en convertissant l'extension en syntaxe Python normale avant que Python ne la voie.

Je l'ai fait pour étendre la fonctionnalité de Python 2 str() par exemple. str() est une cible particulièrement intéressante en raison de son lien implicite avec des données cotées telles que 'this' y 'that' .

Voici un exemple de code étendu, où la seule syntaxe non-Python ajoutée est la fonction extend:testDottedQuad bit :

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

Après quoi je peux écrire dans le code fourni au préprocesseur :

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'

Le préprocesseur mange cela, crache du Python normal sans monkeypatching, et Python fait ce que je voulais qu'il fasse.

De même qu'un préprocesseur c ajoute des fonctionnalités à c, un préprocesseur Python peut également ajouter des fonctionnalités à Python.

L'implémentation de mon préprocesseur est trop importante pour une réponse par débordement de pile, mais pour ceux qui seraient intéressés, c'est aquí sur GitHub.

-1voto

Birk Net Points 11

Je l'utilise comme ça.

class menssagem:
  propriedade1 = "Certo!"
  propriedade2 = "Erro!"

def metodo1(self)
  print(self.propriedade1)

à prolonger.

import menssagem
class menssagem2(menssagem):

  menssagem1 = None #não nescessario not necessary

  def __init__(self,menssagem):
    self.menssagem1 = menssagem

  #call first class method
  #usando o metodo da menssagem 1

  def Menssagem(self):
    self.menssagem1.metodo1()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X