Bonjour,

Je débute en python et je bute sur un point : je voudrais qu'un attribut d'une de mes classes soit contôlé, cad je veux qu'il soit une instance de telle classe.

J'utilise déjà property pour vérifier par exemple que tel attribut est un entier positif, mais quand il s'agit de classe, ça ne marche apparemment pas pareil :
J'arrive à contrôler qu'un argument est une instance de la classe voulue, mais après ça mon attribut peut être changé en n'importe quoi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# -*- coding: iso-8859-15 -*-
 
 
class A():
    def __init__(self):
        pass
 
class B():
    def __init__(self, classeA):
 
        self.__setObjet(classeA)
 
    def __setObjet(self, objet):
        print "Assignation d'un attribut :"
        try :
            assert isinstance(objet, A)
            self.__objet = A
        except AssertionError : print "Erreur, objet de classe A demandé en argument"
    def __getObjet(self):
        return self.__objet
 
    objet = property(__getObjet, __setObjet)
 
## on teste :
 
objetA = A()
 
## Création de l'erreur :
objetB = B("une chaine de caracteres")
--> déclenche l'exception
 
 
## Avec l'avec l'argument qui va bien (instance de la classe A) :
objetB = B(objetA)
print objetB.objet
--> ça marche
 
 
## Le problème c'est qu'on peut changer l'attribut sans que ça passe par __setObjet :"
objetB.objet = 2
print objetB.objet
--> 2
Mon objectif étant d'obtenir une exception si je fais objetB.objet = autre chose qu'une instance de A.

Quelqu'un pourrait me donner l'astuce ?

D'avance merci !