Em python, como você pode estender uma classe? Por exemplo, se eu tiver
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!"
Mas isso não funciona ... Espero que se eu trabalhar em color_extended.py
, quando eu fizer um objeto de cor e usar a getcolor
função, ele retornará o objeto com a string "extendido!" No final. Também deve ter obtido o init da importação.
Suponha que o python 3.1
obrigado
Respostas:
Usar:
Se isso fosse Python 2.x, você também gostaria de derivar
color.Color
deobject
, para torná-lo uma classe new-style :Isso não é necessário no Python 3.x.
fonte
class color(color):
define uma nova classe que substitui a antiga, mas que é derivada dela. (Isso parece ser o que o OP está tentando fazer.)class extended_color(color):
normalmente são padrões ruins -class ExtendedColor(Color):
deveriam ser para as aulas. Apenas umOutra maneira de estender (especificamente significando, adicionar novos métodos, não alterar os existentes) classes, mesmo as integradas, é usar um pré-processador que adiciona a capacidade de estender para fora / acima do escopo do próprio Python, convertendo a extensão para sintaxe normal do Python antes que o Python realmente consiga vê-la.
Fiz isso para estender a
str()
classe do Python 2 , por exemplo.str()
é um alvo particularmente interessante por causa da ligação implícita aos dados citados como'this'
e'that'
.Aqui está um código de extensão, em que a única sintaxe não Python adicionada é o
extend:testDottedQuad
bit:Depois disso, posso escrever no código fornecido ao pré-processador:
O pré-processador come isso, cospe o Python normal sem o monkeypatching, e o Python faz o que eu pretendia fazer.
Assim como um pré-processador ac adiciona funcionalidade a c, também um pré-processador Python pode adicionar funcionalidade ao Python.
Minha implementação de pré-processador é muito grande para uma resposta de estouro de pilha, mas para aqueles que possam estar interessados, ela está aqui no GitHub.
fonte