python - Override the value of a static variable while using decorator -


i've created class following:

class simon:      name = 'simon'      @classmethod     def says(cls, sentence):         return '%s says: %s' % (cls.name, sentence) 

if want simon sit down, can this:

>>> simon.says('sit down') 'simon says: sit down' 

to substitute simon name, say, eva, can subclass this:

class eva(simon):      name = 'eva' 

and result:

>>> eva.says('stand up') 'eva says: stand up' 

now want change says said creating decorator called to_past_tense:

class eva(simon):      name = 'eva'      def to_past_tense(self, func):         def wrapper(*arg, **kw):             present_tense = func(*arg, **kw)             past_tense = present_tense.replace('says', 'said')             return past_tense         return wrapper      @classmethod     def says(cls, *arg, **kw):         return cls.to_past_tense(cls, simon.says)(*arg, **kw) 

if this:

>>> eva.says('stand up') 

what i'm expecting this:

'eva said: stand up' 

but in fact got this

'simon said: stand up' 

how can override value?

and, please, me improve title if isn't precise , clear, thank you!

you using simon.says, retrieving bound class.

if wanted overridden class method have bind current class, use super() proxy object:

@classmethod def says(cls, *arg, **kw):     return cls.to_past_tense(cls, super().says)(*arg, **kw) 

the super() object search mro of class, find says method on simon, bind cls object you, cls.name value still looked eva:

>>> class simon: ...     name = 'simon' ...     @classmethod ...     def says(cls, sentence): ...         return '%s says: %s' % (cls.name, sentence) ...  >>> class eva(simon): ...     name = 'eva' ...     def to_past_tense(self, func): ...         def wrapper(*arg, **kw): ...             present_tense = func(*arg, **kw) ...             past_tense = present_tense.replace('says', 'said') ...             return past_tense ...         return wrapper ...     @classmethod ...     def says(cls, *arg, **kw): ...         return cls.to_past_tense(cls, super().says)(*arg, **kw) ...  >>> eva.says('hello') 'eva said: hello' 

Comments

Popular posts from this blog

html - Firefox flex bug applied to buttons? -

html - Missing border-right in select on Firefox -

python - build a suggestions list using fuzzywuzzy -