Forum Programmation.python Utilisation de __new__ et appel de __init__

Posté par  (site web personnel) .
Étiquettes : aucune
0
15
oct.
2009
Bonjour,
je suis un peu embrouillé... Je veux créer une nouvelle instance d'une classe, en ayant uniquement son type. __new__ semble faire ce que je veux, mais voilà, sans que je ne sache pourquoi, il n'appelle pas __init__, contrairement à ce que me dit la doc python (au passage, j'utilise python 2.6.1):
http://docs.python.org/reference/datamodel.html#object.__new(...)

Prenons l'exemple suivant :

class A (object):
    def __init__ (self):
       print "__init__ called"


Et le résultat en mode interactif :
>>> a = A()
__init__ called
>>> b = object.__new__ (A)
>>>


a et b sont bien du type A, j'ai vérifié. Mais on peut voir que __init__ n'est pas appelé quand je crée l'instance en passant par __new__. Est-ce que quelqu'un saurait où je m'y prends mal ?

Merci d'avance.

PS: le site est ultra chiant pour taper du code python...
  • # pas __new__

    Posté par  . Évalué à 2.

    "Je veux créer une nouvelle instance d'une classe, en ayant uniquement son type."
    Alors ce n'est pas __new__ que tu cherches.
    Il te suffit d'"appeler" comme une fonction le type.

    >>> class foo(object):
    ...     pass
    ...
    >>> bar=foo
    >>> type(bar())
    <class '__main__.foo'>
    >>> bar
    <class '__main__.foo'>

    • [^] # Re: pas __new__

      Posté par  . Évalué à 6.

      Ah putain quelle grosse merde templeet.
      • [^] # Re: pas __new__

        Posté par  (site web personnel) . Évalué à 2.

        Je compatis, c'est à s'arracher les cheveux :-)
        En tout cas, un très grand merci, c'est exactement ce que je voulais !
        • [^] # Re: pas __new__

          Posté par  . Évalué à 3.

          Une chose pas mal en python, c'est que les pointeurs (références) s'écrivent de façon relativement naturelle :
          Si on a une classe "A" ou une fonction "f", ou une méthode "objet.m", et qu'on veut y faire référence, il suffit simplement d'écrire "A", "f" ou "objet.m". On peut éventuellement l'affecter, et enfin l'appeler d'où que ce soit en faisant "la_reference(a, r, g, u, ments)"
          • [^] # Re: pas __new__

            Posté par  . Évalué à 3.

            Au passage (dommage qu'on puisse pas éditer les posts), un autre exemple, on peut créér un objet du même type qu'un autre objet comme ça : objet2=type(objet1)() ou objet2=objet1.__class__()

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.