J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
oui avec les class new-age ;-)
class A(object): __slots__=['name']
ne pas oublier le (object)
-- William Dodé - http://flibuste.net Développeur informatique indépendant
Eric Brunel
On Tue, 19 Dec 2006 17:30:31 +0100, William Dode wrote:
On 19-12-2006, JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
oui avec les class new-age ;-)
class A(object): __slots__=['name']
... ce qui est considéré comme un abus de __slots__ et qui risque de poser plein de problèmes par la suite, en particulier si on crée des sous-classes de A. L'attribut __slots__ est prévu pour faire des optimisations de mémoire dans le cas de petites classes avec peu d'attributs, pas pour limiter les attributs possibles. Voir ici un message de notre vénéré BDFL sur le sujet: http://mail.python.org/pipermail/python-dev/2003-August/037542.html
Pour JBB, pourquoi veux-tu faire ça? Si tu ne veux pas rajouter d'attribut dynamiquement depuiss l'extérieur de la classe, ne le fais pas. Où est le problème? -- python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"
On Tue, 19 Dec 2006 17:30:31 +0100, William Dode <wilk@flibuste.net> wrote:
On 19-12-2006, JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/
exemple:
class A:
pass
x = A()
x.name = "toto" # crée une nouvelle donnée membre, uniquement sur
l'objet x.
je prefererais faire un truc du genre:
class A:
def __init__(self):
self.name = ""
x = A()
x.name = "toto" # ok
x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
oui avec les class new-age ;-)
class A(object):
__slots__=['name']
... ce qui est considéré comme un abus de __slots__ et qui risque de poser
plein de problèmes par la suite, en particulier si on crée des
sous-classes de A. L'attribut __slots__ est prévu pour faire des
optimisations de mémoire dans le cas de petites classes avec peu
d'attributs, pas pour limiter les attributs possibles. Voir ici un message
de notre vénéré BDFL sur le sujet:
http://mail.python.org/pipermail/python-dev/2003-August/037542.html
Pour JBB, pourquoi veux-tu faire ça? Si tu ne veux pas rajouter d'attribut
dynamiquement depuiss l'extérieur de la classe, ne le fais pas. Où est le
problème?
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"
On Tue, 19 Dec 2006 17:30:31 +0100, William Dode wrote:
On 19-12-2006, JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
oui avec les class new-age ;-)
class A(object): __slots__=['name']
... ce qui est considéré comme un abus de __slots__ et qui risque de poser plein de problèmes par la suite, en particulier si on crée des sous-classes de A. L'attribut __slots__ est prévu pour faire des optimisations de mémoire dans le cas de petites classes avec peu d'attributs, pas pour limiter les attributs possibles. Voir ici un message de notre vénéré BDFL sur le sujet: http://mail.python.org/pipermail/python-dev/2003-August/037542.html
Pour JBB, pourquoi veux-tu faire ça? Si tu ne veux pas rajouter d'attribut dynamiquement depuiss l'extérieur de la classe, ne le fais pas. Où est le problème? -- python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"
William Dode
On 19-12-2006, Eric Brunel wrote:
On Tue, 19 Dec 2006 17:30:31 +0100, William Dode wrote:
On 19-12-2006, JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
oui avec les class new-age ;-)
class A(object): __slots__=['name']
... ce qui est considéré comme un abus de __slots__ et qui risque de poser plein de problèmes par la suite, en particulier si on crée des sous-classes de A. L'attribut __slots__ est prévu pour faire des optimisations de mémoire dans le cas de petites classes avec peu d'attributs, pas pour limiter les attributs possibles. Voir ici un message de notre vénéré BDFL sur le sujet: http://mail.python.org/pipermail/python-dev/2003-August/037542.html
Tu lui diras pas hein ?
Merci pour l'info
-- William Dodé - http://flibuste.net Développeur informatique indépendant
On 19-12-2006, Eric Brunel wrote:
On Tue, 19 Dec 2006 17:30:31 +0100, William Dode <wilk@flibuste.net> wrote:
On 19-12-2006, JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/
exemple:
class A:
pass
x = A()
x.name = "toto" # crée une nouvelle donnée membre, uniquement sur
l'objet x.
je prefererais faire un truc du genre:
class A:
def __init__(self):
self.name = ""
x = A()
x.name = "toto" # ok
x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
oui avec les class new-age ;-)
class A(object):
__slots__=['name']
... ce qui est considéré comme un abus de __slots__ et qui risque de poser
plein de problèmes par la suite, en particulier si on crée des
sous-classes de A. L'attribut __slots__ est prévu pour faire des
optimisations de mémoire dans le cas de petites classes avec peu
d'attributs, pas pour limiter les attributs possibles. Voir ici un message
de notre vénéré BDFL sur le sujet:
http://mail.python.org/pipermail/python-dev/2003-August/037542.html
Tu lui diras pas hein ?
Merci pour l'info
--
William Dodé - http://flibuste.net
Développeur informatique indépendant
On Tue, 19 Dec 2006 17:30:31 +0100, William Dode wrote:
On 19-12-2006, JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
oui avec les class new-age ;-)
class A(object): __slots__=['name']
... ce qui est considéré comme un abus de __slots__ et qui risque de poser plein de problèmes par la suite, en particulier si on crée des sous-classes de A. L'attribut __slots__ est prévu pour faire des optimisations de mémoire dans le cas de petites classes avec peu d'attributs, pas pour limiter les attributs possibles. Voir ici un message de notre vénéré BDFL sur le sujet: http://mail.python.org/pipermail/python-dev/2003-August/037542.html
Tu lui diras pas hein ?
Merci pour l'info
-- William Dodé - http://flibuste.net Développeur informatique indépendant
Olivier Ravard
JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
Utiliser __getattr__
JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/
exemple:
class A:
pass
x = A()
x.name = "toto" # crée une nouvelle donnée membre, uniquement sur
l'objet x.
je prefererais faire un truc du genre:
class A:
def __init__(self):
self.name = ""
x = A()
x.name = "toto" # ok
x.truc = 1 # génère une exception
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
Utiliser __getattr__
Bruno Desthuilliers
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
class A(object): _attribs = ['name',] def __setattr__(self, name, value): if name not in self._attribs: raise AttributeError("can't set attribute %s" % name) object.__setattr__(self, name, value)
Mais bon... Je ne vois vraiment pas l'intérêt de faire ça. Un utilisateur de ta classe peut avoir une raison parfaitement valide de vouloir ajouter un attribut à ta classe, et il te maudira en constatant que tu l'en empêche arbitrairement.
J'aimerai pouvoir empêcher d'ajouter des données membres/
exemple:
class A:
pass
x = A()
x.name = "toto" # crée une nouvelle donnée membre, uniquement sur
l'objet x.
je prefererais faire un truc du genre:
class A:
def __init__(self):
self.name = ""
x = A()
x.name = "toto" # ok
x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
class A(object):
_attribs = ['name',]
def __setattr__(self, name, value):
if name not in self._attribs:
raise AttributeError("can't set attribute %s" % name)
object.__setattr__(self, name, value)
Mais bon... Je ne vois vraiment pas l'intérêt de faire ça. Un
utilisateur de ta classe peut avoir une raison parfaitement valide de
vouloir ajouter un attribut à ta classe, et il te maudira en constatant
que tu l'en empêche arbitrairement.
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
class A(object): _attribs = ['name',] def __setattr__(self, name, value): if name not in self._attribs: raise AttributeError("can't set attribute %s" % name) object.__setattr__(self, name, value)
Mais bon... Je ne vois vraiment pas l'intérêt de faire ça. Un utilisateur de ta classe peut avoir une raison parfaitement valide de vouloir ajouter un attribut à ta classe, et il te maudira en constatant que tu l'en empêche arbitrairement.
Bruno Desthuilliers
JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
Utiliser __getattr__
Pour empêcher de *créer* un nouvel attribut ?
JBB wrote:
J'aimerai pouvoir empêcher d'ajouter des données membres/
exemple:
class A:
pass
x = A()
x.name = "toto" # crée une nouvelle donnée membre, uniquement sur
l'objet x.
je prefererais faire un truc du genre:
class A:
def __init__(self):
self.name = ""
x = A()
x.name = "toto" # ok
x.truc = 1 # génère une exception
J'aimerai pouvoir empêcher d'ajouter des données membres/ exemple: class A: pass
x = A() x.name = "toto" # crée une nouvelle donnée membre, uniquement sur l'objet x.
je prefererais faire un truc du genre:
class A: def __init__(self): self.name = ""
x = A() x.name = "toto" # ok x.truc = 1 # génère une exception
Est ce que c'est possible de faire ça en python?
Utiliser __getattr__
Pour empêcher de *créer* un nouvel attribut ?
jean-michel bain-cornu
Bonjour,
J'aimerai pouvoir empêcher d'ajouter des données membres/ Est ce que c'est possible de faire ça en python?
Je te propose le programme ci-après qui peut être une réponse me semble-t-il. Il affiche 'methode x ok' et 'methode y ok'. Si on enlève le commentaire de la ligne '##obj.test=...', une exception AttributeError est déclenchée. Ce n'est pas automatique, il faut appeler self.check() au début de chaque méthode de la classe A, et l'exception ne se déclenche pas au moment de l'attribution, mais au moment ou l'objet vérifie ses membres. Mais c'est mieux que rien, et je n'ai pas trouvé d'autre moyen. Par contre, c'est relativement propre. Les contraintes sont de déclarer les membres dans l'__init__, et d'appeler self.check() dans chaque méthode. Ca peut servir si tu veux absolument préserver l'encapsulation dans certains cas. Ce qui serait bien, ce serait de pouvoir surdéfinir l'affectation d'un membre, comme on le fait avec __eq__ par exemple pour le test d'égalité. Dans ce cas, le self.check() pourrait être fait au moment de l'affectation, et donc l'exception déclenchée si besoin. Quelqu'un sait-il faire ça ? A+ jm
J'aimerai pouvoir empêcher d'ajouter des données membres/
Est ce que c'est possible de faire ça en python?
Je te propose le programme ci-après qui peut être une réponse me
semble-t-il. Il affiche 'methode x ok' et 'methode y ok'. Si on enlève
le commentaire de la ligne '##obj.test=...', une exception
AttributeError est déclenchée.
Ce n'est pas automatique, il faut appeler self.check() au début de
chaque méthode de la classe A, et l'exception ne se déclenche pas au
moment de l'attribution, mais au moment ou l'objet vérifie ses membres.
Mais c'est mieux que rien, et je n'ai pas trouvé d'autre moyen. Par
contre, c'est relativement propre.
Les contraintes sont de déclarer les membres dans l'__init__, et
d'appeler self.check() dans chaque méthode.
Ca peut servir si tu veux absolument préserver l'encapsulation dans
certains cas.
Ce qui serait bien, ce serait de pouvoir surdéfinir l'affectation d'un
membre, comme on le fait avec __eq__ par exemple pour le test d'égalité.
Dans ce cas, le self.check() pourrait être fait au moment de
l'affectation, et donc l'exception déclenchée si besoin. Quelqu'un
sait-il faire ça ?
A+
jm
J'aimerai pouvoir empêcher d'ajouter des données membres/ Est ce que c'est possible de faire ça en python?
Je te propose le programme ci-après qui peut être une réponse me semble-t-il. Il affiche 'methode x ok' et 'methode y ok'. Si on enlève le commentaire de la ligne '##obj.test=...', une exception AttributeError est déclenchée. Ce n'est pas automatique, il faut appeler self.check() au début de chaque méthode de la classe A, et l'exception ne se déclenche pas au moment de l'attribution, mais au moment ou l'objet vérifie ses membres. Mais c'est mieux que rien, et je n'ai pas trouvé d'autre moyen. Par contre, c'est relativement propre. Les contraintes sont de déclarer les membres dans l'__init__, et d'appeler self.check() dans chaque méthode. Ca peut servir si tu veux absolument préserver l'encapsulation dans certains cas. Ce qui serait bien, ce serait de pouvoir surdéfinir l'affectation d'un membre, comme on le fait avec __eq__ par exemple pour le test d'égalité. Dans ce cas, le self.check() pourrait être fait au moment de l'affectation, et donc l'exception déclenchée si besoin. Quelqu'un sait-il faire ça ? A+ jm