Allez, une abération que j'ai jamais supporté dans python :
pourquoi se trimbaler "self" dans la définition d'une méthode d'un objet ?
Ok, explicit better gnia gnia gnia
Le programme / les développeurs sont trop con pour savoir qu'une méthode qui se trouve dans la définition d'un objet est lié à un objet ?
Ca pue surtout le modèle objet un peu foiré ça...
Il y a effectivement pas mal de langages ou il est implicite, mais bien souvent ça entretient une confusion sur son statut, ses possibilités, ...
Au moins en Python les choses sont claires, l'instance est un argument comme les autres (on peut le nommer toto si ça nous chante).
Voir self/this comme un argument est très pratique pour exploiter pleinement l'héritage multiple par exemple:
class Foo(object):
def bar(self, arg0):
print self, arg0
foo = Foo()
foo.bar('baz')
# <__main__.Foo object at 0x7f22d6d0aef0> baz
Foo.bar(1)
# TypeError: unbound method bar() must be called with Foo instance as first argument (got str instance instead)
Foo.bar(foo, 'baz')
# <__main__.Foo object at 0x7f22d6d0aef0> baz
class Qux(object):
def bar(self, arg0):
print 'Qux !'
class Fum(Foo, Qux):
pass
Fum().bar('egg')
# <__main__.Fum object at 0x7f22d6bfa7d0> egg
class Fum(Foo, Qux):
def bar(self, *args, **kwargs):
return Qux.bar(self, *args, **kwargs)
Fum().bar('egg')
# Qux !map(Foo.bar, [Fum()] * 2, ['egg', 'spam'])
# <__main__.Fum object at 0x7f22d6c5c490> egg
# <__main__.Fum object at 0x7f22d6c5c490> spam
Et tu peut même intervenir dans l'autre sens quand tu commence à taper dans les __new__ et autres __metaclass__.
[^] # Re: Explicit is better than implicit.
Posté par Jean B . En réponse au journal Perl, Javouille, Lisaac|(Ruby|SmallTalk|etc..). Évalué à 2.
pourquoi se trimbaler "self" dans la définition d'une méthode d'un objet ?
Ok, explicit better gnia gnia gnia
Le programme / les développeurs sont trop con pour savoir qu'une méthode qui se trouve dans la définition d'un objet est lié à un objet ?
Ca pue surtout le modèle objet un peu foiré ça...
C'est un héritage du modèle objet de en:Modula-3.
Il y a effectivement pas mal de langages ou il est implicite, mais bien souvent ça entretient une confusion sur son statut, ses possibilités, ...
Au moins en Python les choses sont claires, l'instance est un argument comme les autres (on peut le nommer toto si ça nous chante).
Voir self/this comme un argument est très pratique pour exploiter pleinement l'héritage multiple par exemple:
class Foo(object):
def bar(self, arg0):
print self, arg0
foo = Foo()
foo.bar('baz')
# <__main__.Foo object at 0x7f22d6d0aef0> baz
Foo.bar(1)
# TypeError: unbound method bar() must be called with Foo instance as first argument (got str instance instead)
Foo.bar(foo, 'baz')
# <__main__.Foo object at 0x7f22d6d0aef0> baz
class Qux(object):
def bar(self, arg0):
print 'Qux !'
class Fum(Foo, Qux):
pass
Fum().bar('egg')
# <__main__.Fum object at 0x7f22d6bfa7d0> egg
class Fum(Foo, Qux):
def bar(self, *args, **kwargs):
return Qux.bar(self, *args, **kwargs)
Fum().bar('egg')
# Qux !map(Foo.bar, [Fum()] * 2, ['egg', 'spam'])
# <__main__.Fum object at 0x7f22d6c5c490> egg
# <__main__.Fum object at 0x7f22d6c5c490> spam
Et tu peut même intervenir dans l'autre sens quand tu commence à taper dans les __new__ et autres __metaclass__.