PythonWin del shell interactivo de python llamar a los constructores de dos veces?

StackOverflow https://stackoverflow.com/questions/81191

  •  09-06-2019
  •  | 
  •  

Pregunta

A la hora de responder Estática de las variables de la clase en Python

Me di cuenta de que PythonWin PyWin32 construir 209.2 intérprete parece a evaluar dos veces?

PythonWin 2.5 (r25:51908, Mar  9 2007, 17:40:28) [MSC v.1310 32 bit (Intel)] on win32.
Portions Copyright 1994-2006 Mark Hammond - see 'Help/About PythonWin' for further copyright information.
>>> class X:
...     l = []
...     def __init__(self):
...         self.__class__.l.append(1)
...         
>>> X().l
[1, 1]
>>> 

mientras que el intérprete de python que hace lo correcto

C:\>python
ActivePython 2.5.0.0 (ActiveState Software Inc.) based on
Python 2.5 (r25:51908, Mar  9 2007, 17:40:28) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class X:
...   l = []
...   def __init__(self):
...     self.__class__.l.append(1)
...
>>> X().l
[1]
>>>
¿Fue útil?

Solución

Mi conjetura es la siguiente.El PythonWin editor ofrece autocompletar para un objeto, es decir,cuando se escriba myobject. dispone de una pequeña ventana emergente de todos los disponibles los nombres de método.Así que creo que cuando se escriba X(). es la creación de una instancia de X en el fondo y haciendo un dir o similar para averiguar los atributos del objeto.

Por lo que el constructor es el único ser de ejecución una vez para cada objeto pero para darle la interactividad es la creación de objetos silenciosamente en segundo plano sin antes decirle a usted acerca de él.

Otros consejos

Dave Webb es correcta, y usted puede ver esto mediante la adición de una instrucción print:

>>> class X:
...     l = []
...     def __init__(self):
...             print 'inited'
...             self.__class__.l.append(1)
...             

Entonces, tan pronto como el período en el tipo de X(). imprime inited antes de ofrecer la finalización de la ventana emergente.

Dos pequeños puntos adicionales.

En primer lugar, self.__class__.l.append(1) no es muy sensato.

Acaba de decir self.l.append(1).Python busca en la instancia antes de buscar en la clase de la referencia.

Lo que es más importante, variables de nivel de clase rara vez son útiles.A nivel de clase constantes son a veces sensible, pero incluso entonces, son difíciles de justificar.

En C++ y Java, nivel de clase ('static') variables parecen útiles, pero no hacen mucho de valor.Son difíciles de enseñar a n00bz -- a menudo perdiendo un montón de tiempo en el aula en presencia-y que no son muy prácticos.Si quieres saber todas las instancias de una X que fue creado, es probablemente mejor para crear una XFactory clase que no dependen de las variables de la clase.

class XFactory( object ):
    def __init__( self ):
        self.listOfX= []
    def makeX( self, *args, **kw ):
        newX= X(*args,**kw)
        self.listOfX.append(newX)
        return newX

Ninguna variable de nivel de clase de anomalías.Y no confundir a la X con la colección de X.En el largo plazo, me parece confuso cuando una clase es una cosa y también algunos de la colección de cosas.

Sencillo es mejor que Complejo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top