2012-04-20 16 views
7

Se supone que el código siguiente debe imprimir lo mismo tres veces. ¿Por qué no?Raracidad de acceso variable en un derivado de QObject

from PySide.QtCore import QObject 


class A(QObject): 
    instance = 1 

    @classmethod 
    def test(cls): 
     cls.instance # Remove this line and it prints the right thing 
     cls.instance = cls() 
     print(cls.__dict__['instance']) 
     print(cls.instance) 
     print(type.__getattribute__(cls, 'instance')) 

A.test() 

Resultado esperado:

<__main__.A object at 0x1310c20> 
<__main__.A object at 0x1310c20> 
<__main__.A object at 0x1310c20> 

Resultado real:

<__main__.A object at 0x2242878> 
1 
1 

La metaclase detrás QObject ni siquiera anular getAttribute así que ¿cómo es posible que yo no recibo la instancia A vuelve con "cls.instance"?

Aún más extraño es que el hecho de no acceder al atributo (ver la línea de código comentada) antes de asignarlo hace que funcione bien.

puedo reproducir este como sigue (con PySide 1.1.0):

  • Windows 7 64-bit, Python 2.7.1 de 32 bits: obras
  • Windows 7 64-bit, Python 2.7 0.3 de 32 bits: obras
  • Windows 7 de 64 bits, Python 3.2.3 de 32 bits: falla
  • Ubuntu 11.10 64 bits, Python 2.7.2+: trabaja
  • Ubuntu 11.10 de 64 bits, Python 3.2.2: falla

Actualización: Logré compilar PySide 1.1.1 en Python 3.2.2 en Ubuntu, y no soluciona el problema.

+0

'32bit' Me estoy poniendo espera Python 2.7.3 y 1.1.0 PySide en Windows. – reclosedev

+0

Python 2.7.3 en Ubuntu 12.04, tanto PySide como PyQt4 proporcionan los resultados esperados. – pwuertz

+0

Python 3, ¿alguien? Ese parece ser el quid del problema aquí. –

Respuesta

1

Puedo confirmar esto en Python 3.2.3/PySide 1.1.0, Ubuntu 12.04. Funciona con PyQt4 en la misma instalación.

Esto es, sin duda, un error en PySide. Debe presentar un informe de error, si aún no lo ha hecho.

Si Sólo cambio el ejemplo un poco, incluso el ejemplo segfaults:

resultados
from PySide.QtCore import * 

class A(QObject): 
    instance = [] 

    @classmethod 
    def test(cls): 
     print(cls.instance) 
     cls.instance = cls() 
     print(cls.__dict__['instance']) 
     print("still ok") 
     print(cls.instance) 
     print("you won't see me") 
     print(type.__getattribute__(cls, 'instance')) 

A.test() 
Cuestiones relacionadas