extending class

Jean-Michel Pichavant jeanmichel at sequans.com
Fri Sep 23 15:17:53 CEST 2011


Andrea Crotti wrote:
> On 09/23/2011 10:31 AM, Peter Otten wrote:
>>
>> Inside __getattribute__() you ask for self.first_var which triggers 
>> another
>> __getattribute__() call that once again trys to determine the first_var
>> attribute before it returns...
>>
>> Try using __getattr__() instead which is only triggered for non-existent
>> attributes
>>
>> def __getattr__(self, name):
>>      return getattr(self.first_var, name)
>>
>> or check for the attributes you don't want to delegate explicitly:
>>
>> def __getattribute__(self, name):
>>      if name == "first_var":
>>          return super(PSIVar, self).__getattribute__(name)
>>
>
> Right thanks a lot it works perfectly.
> I don't like too much, however, to mess around in this way, maybe it's 
> better if I just fork the project
> and patch the original code.
>
> In this way maybe I can also contribute to it with patches (if they 
> are accepted)...
Did you consider subclassing your Var class ? This is how you extend a 
class behavior in OOP.

class PSIVar(var):
    def __init__(self, name, desc, other=None, fun=None):
        var.__init__(self, name, desc)
        if other is not None:
            self.other = other
            self.fun = fun
            assert callable(self.fun)

v1 = PSIVar('name', 'desc')

that's it.

By the way, don't create instance attribute conditionally. Your PSIVar 
instance should always have a 'other' attribute, its value can be None 
though.



JM



More information about the Python-list mailing list