2011-03-07 4 views
0

Édité parce que je suis un crétin. Aurait dû dire classe à l'origine.Question d'héritage et de portée de Python

J'ai le code qui fait quelque chose comme ceci:

file1.py

class A(object): 
    def __init__(self): 
    stuff_here() 

class B(object): 
    def func(self): 
    self.a = A() 

file2.py

import file1 
class A(file1.A): 
    def __init__(self): 
    file1.A(self) 
    self.thing = other_thing 

class B(file1.B): 
    pass 

Je voudrais que quand j'instancier file2.B() il utilise file2.A() pour son membre a, pas file1.A()

Y at-il un moyen de faire cela? J'ai essayé de regarder les règles de portée de python, mais je pense que je l'ai mal compris.

+3

Peut-être que 'Object' devrait être' class'. –

+3

Pourriez-vous être un peu plus concret sur ce que vous essayez de construire? Alors peut-être que nous pouvons apporter des suggestions alternatives. – Thomas

+0

J'étends un système qui a déjà des classes qui contiennent beaucoup de code. J'ai besoin de modifier 1 détail d'implémentation minuscule de la classe A, car la classe d'origine fait une supposition qui n'est pas vraie pour mes données. – PGM

Répondre

1

Vous pouvez utiliser un attribut de classe pour contenir la classe que vous souhaitez utiliser. Dans le premier fichier, utilisez

class B(object): 
    A = A 
    def func(self): 
     self.a = self.A() 

et dans le second fichier, utilisez

class B(file1.B): 
    A = A 

Il y a probablement une meilleure façon de parvenir à ce que vous voulez atteindre ...

Modifier : Votre commentaire à votre question suggère que vous ne voulez pas réellement changer le code dans le premier fichier. Dans ce cas, vous pouvez essayer de "patch singe" file1.py. Écrivez file2.py comme

import file1 

class A(file1.A): 
    def __init__(self): 
     file1.A(self) 
     self.thing = other_thing 

file1.A = A 

Maintenant, vous fait par votre file1.A substitué propre version. C'est certainement hacky, mais parfois le moyen le plus rapide d'obtenir quelque part.

+0

+1 mais avec des réserves. Bien qu'il doive faire ce que demande le PO, je ne peux pas m'empêcher de penser que tout ce que les PO essayent vraiment d'accomplir pourrait être mieux fait d'une autre manière. – Davy8

+0

Cela a certainement fonctionné, mais il se sent comme un hack. Je peux au moins avancer jusqu'à ce que je trouve quelque chose de plus élégant. Merci beaucoup. – PGM

0

Définissez une méthode dans le parent qui retourne la classe à utiliser et remplacez-la dans l'enfant.