Comments on: La différence entre __new__ et __init__ en Python http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/ Du code, du cul Mon, 28 Oct 2019 11:54:55 +0000 hourly 1 https://wordpress.org/?v=4.9.7 By: Sam http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-185785 Thu, 23 Feb 2017 12:15:34 +0000 http://sametmax.com/?p=3534#comment-185785 Yep:

class Temperature(int):
    
    def __new__(cls, val, unit):
        return super().__new__(cls, val)
    
    def __init__(self, val, unit):
        super().__init__()
        self.unit = unit
        
    def __str__(self):  
        return '%g %s' % (self, self.unit)
    
    def __add__(self, other):
        if self.unit != other.unit:
            raise ValueError("Choux et carottes, connard !")
        return Temperature(super().__add__(other), self.unit)


t1 = Temperature(1, "C")
t2 = Temperature(2, "C")
t3 = Temperature(2, "K")

print(t1 + t2)
print(t2 + t3)

Mais bon autant utiliser une lib existante type https://pypi.python.org/pypi/units/

]]>
By: Daxley http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-185747 Wed, 22 Feb 2017 14:34:22 +0000 http://sametmax.com/?p=3534#comment-185747 Mais du coup en héritant float on peut aditionner des objets température avec un + ?

Du style une pseudo surcharge d’opérateur comme en C++

Et si on peut, peut on aussi renvoyer une exception dans le cas où l’unité ne serait pas la même ?

]]>
By: Sam http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-177198 Wed, 16 Mar 2016 15:14:33 +0000 http://sametmax.com/?p=3534#comment-177198 C’est le cls qui est trompeur.

Merci pour les typos.

]]>
By: ast http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-177196 Wed, 16 Mar 2016 14:47:14 +0000 http://sametmax.com/?p=3534#comment-177196 Ah new est une méthode statique. Dans ce cas Gilles Lenfant s’est trompé dans son commentaire, il dit que c’est une classmethod

]]>
By: ast http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-177194 Wed, 16 Mar 2016 14:19:36 +0000 http://sametmax.com/?p=3534#comment-177194 Une petite coquille dans la classe Temperature:

def init(self, value, unit):

…super(Temperature, cls).init(value)

remplacer cls par self

ça ne change pas le message d’erreur car l’erreur se produit avant, à l’appel de new

]]>
By: Sam http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-177193 Wed, 16 Mar 2016 13:47:10 +0000 http://sametmax.com/?p=3534#comment-177193 La réponse est assez surprenante:

>>> class Foo:
...     pass

>>> Foo.__new__
 # note l'id
>>> type(Foo.__new__(Foo)) # note l'effet


>>> object.__new__ 
 # meme id !
>>> type(object.__new__(Foo)) # meme effet !


__new__ est n’est pas une méthode de Foo mais de object, qui est attachée à Foo. C’est aussi une méthode statique. Toute classe custo en Python hérite de object, mais comme new est appelée très souvent, plutot que de faire un look up au parent à chaque fois ce qui est couteux, Python utilise cette astuce pour avoir la meme methode partout.

]]>
By: ast http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-177188 Wed, 16 Mar 2016 09:57:59 +0000 http://sametmax.com/?p=3534#comment-177188 Dans cette classe:

class Premiere(object):

... def new(cls, prix):

... print "%s euros" % prix

... return super(Premiere, cls).new(cls)

je m’étonne qu’il faille passer cls en argument de new

Quand on utilise super() pour aller chercher le init d’une classe parente, on utilise la syntaxe:

super(MyClass, self).init()

il n’y a pas le self passé en argument du init(). il est passé automatiquement.

Alors pourquoi cls est passé en argument de new ?

]]>
By: Gilles Lenfant http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-162869 Thu, 02 Jul 2015 15:26:51 +0000 http://sametmax.com/?p=3534#comment-162869 On pourra aussi noter que new est la seule classmethod implicite de Python (il n’est pas nécessaire de précéder la méthode new du décorateur @classmethod)

]]>
By: Sam http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-5084 Sat, 12 Jan 2013 09:05:47 +0000 http://sametmax.com/?p=3534#comment-5084 @Krypted: peewee a un exemple d’utilisation de __new__ en prod. Il faut le lire lentement par contre :-)

@jpcw: Oui mais dans les docs on lit immutable partout, donc je garde volontairement le terme pour qu’un débutant puisse faire facilement le lien. Il faut faire des concessions.

]]>
By: jpcw http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/#comment-5082 Sat, 12 Jan 2013 07:39:42 +0000 http://sametmax.com/?p=3534#comment-5082 s/immutable/immuable/g
ça sonne quand même beaucoup mieux, et ça n’entache plus la qualité de l’article.

]]>