[Python] Uso di __getattr__ e old style class e new style class

Giovanni Porcari giovanni.porcari a softwell.it
Mer 9 Ott 2013 16:26:29 CEST


Buongiorno a tutti

Dato il seguente codice :

------------------------------------------------
class TestClassOldStyle():
    def __init__(self):
        self.store = dict()

    def __getattr__(self,name):
        print '__getattr__ :' ,name
        if not hasattr(dict,name):
            raise AttributeError("dict has no attribute '%s'" % name)
        return getattr(self.store,name)

class TestClassNewStyle(object):
    def __init__(self):
        self.store = dict()

    def __getattr__(self,name):
        print '__getattr__ :' ,name
        if not hasattr(dict,name):
            raise AttributeError("dict has no attribute '%s'" % name)
        return getattr(self.store,name)

def test(factory):
    x = factory()
    x['foo'] = 21
    print x['foo']
    print len(x)

if __name__=="__main__":
    print ' --------- TestClassOldStyle ------'
    test(TestClassOldStyle)

    print '\n\n\n --------- TestClassNewStyle ------'
    test(TestClassNewStyle)




Risultato :

--------- TestClassOldStyle ------
__getattr__ : __setitem__
__getattr__ : __getitem__
21
__getattr__ : __len__
1


--------- TestClassNewStyle ------
Traceback (most recent call last):
  File "/Users/fporcari/Downloads/pyro_test/testobject.py", line 38, in <module>
    test(TestClassNewStyle)
  File "/Users/fporcari/Downloads/pyro_test/testobject.py", line 27, in test
    x['foo'] = 21
TypeError: 'TestClassNewStyle' object does not support item assignment
------------------------------------------------------------------------

In pratica vorrei che per ogni attributo che è definito in dict mi venisse restituita
la chiamata su self.store mentre ogni attributo non definito in dict dovrebbe generare un 
attribute error.

Magari è una cosa banale ma ora come ora non vedo perchè con le new style class non funzioni 
e non funzioni al punto di non mettere nemmeno le print di debug...


Grazie :)

G


Maggiori informazioni sulla lista Python