2010-01-04 8 views
3

J'ai joué avec des classes de surcharge ou de masquage en Python. Est-ce que les exemples de code suivants créent des classes équivalentes?Créer des classes équivalentes en Python?

class CustASample(object): 
    def __init__(self): 
     self.__class__.__name__ = "Sample" 

    def doSomething(self): 
     dummy = 1 

et

class Sample(object): 
    def doSomething(self): 
     dummy = 1 

EDIT: D'après les commentaires et la bonne réponse et par gs, elle a eu lieu pour moi, que je voulais vraiment demander: Qu'est-ce que « attributs » font ces classes diffèrent?

Parce que

>>> dir(a) == dir(b) 
True 

et

>>> print Sample 
<class '__main__.Sample'> 
>>> print CustASample 
<class '__main__.Sample'> 

mais

>>> Sample == CustASample 
False 
+0

Vous pouvez utiliser des classes de style nouveau qui héritent de l'objet. –

+1

Que signifie «équivalent» pour vous? Avez-vous des cas de test? –

Répondre

10

Non, ils sont encore différents.

a = CustASample() 
b = Sample() 
a.__class__ is b.__class__ 
-> False 

Voilà comment vous pouvez le faire:

class A(object): 
    def __init__(self): 
     self.__class__ = B 

class B(object): 
    def bark(self): 
     print "Wuff!" 

a = A() 
b = B() 
a.__class__ is b.__class__ 
-> True 

a.bark() 
-> Wuff! 

b.bark() 
-> Wuff! 

Habituellement, vous le feriez dans la méthode __new__ au lieu de __init__:

class C(object): 
    def __new__(cls): 
     return A() 

Pour répondre à votre question mise à jour :

>>> a = object() 
>>> b = object() 
>>> a == b 
False 

Pourquoi un pas égal à b, puisque les deux ne sont que des objets simples sans attributs?

Eh bien, cette réponse est simple. L'opérateur == invoque __eq__, s'il est disponible. Mais à moins que vous ne le définissiez vous-même, ce n'est pas le cas. Au lieu de cela, a is b est utilisé.

is compare les identifiants des objets. (. En CPython l'adresse mémoire) Vous pouvez obtenir l'identifiant d'un objet comme celui-ci:

>>> id(a) 
156808 
0

classes aussi, non seulement des cas, sont des objets. Par exemple, vous pouvez obtenir l'ID (Sample). Essayez-le et voyez que ces deux nombres diffèrent, car les emplacements de mémoire des classes diffèrent. Ils ne sont pas le même objet. C'est comme demander si [] is [].

EDIT: Trop tard et l'explication par gs est meilleure.

Questions connexes