• [^] # Re: Explicit is better than implicit.

    Posté par . En réponse au journal Perl, Javouille, Lisaac|(Ruby|SmallTalk|etc..). Évalué à 2.

    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...


    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__.