python properties and inheritance

后端 未结 10 1429
粉色の甜心
粉色の甜心 2020-12-12 18:06

I have a base class with a property which (the get method) I want to overwrite in the subclass. My first thought was something like:

class Foo(object):
    d         


        
相关标签:
10条回答
  • 2020-12-12 18:47

    I don't agree that the chosen answer is the ideal way to allow for overriding the property methods. If you expect the getters and setters to be overridden, then you can use lambda to provide access to self, with something like lambda self: self.<property func>.

    This works (at least) for Python versions 2.4 to 3.6.

    If anyone knows a way to do this with by using property as a decorator instead of as a direct property() call, I'd like to hear it!

    Example:

    class Foo(object):
        def _get_meow(self):
            return self._meow + ' from a Foo'
        def _set_meow(self, value):
            self._meow = value
        meow = property(fget=lambda self: self._get_meow(),
                        fset=lambda self, value: self._set_meow(value))
    

    This way, an override can be easily performed:

    class Bar(Foo):
        def _get_meow(self):
            return super(Bar, self)._get_meow() + ', altered by a Bar'
    

    so that:

    >>> foo = Foo()
    >>> bar = Bar()
    >>> foo.meow, bar.meow = "meow", "meow"
    >>> foo.meow
    "meow from a Foo"
    >>> bar.meow
    "meow from a Foo, altered by a Bar"
    

    I discovered this on geek at play.

    0 讨论(0)
  • 2020-12-12 18:47
    class Foo:
        # Template method
        @property
        def age(self):
            return self.dothis()
        # Hook method of TM is accessor method of property at here
        def dothis(self):
            return 11
    class Bar(Foo):
        def dothis(self):
            return 44
    

    Same as Nizam Mohamed, just to mention that style guide 2.13.4 using both template method and property

    0 讨论(0)
  • 2020-12-12 18:48

    Yes, this is the way to do it; the property declaration executes at the time the parent class' definition is executed, which means it can only "see" the versions of the methods which exist on the parent class. So when you redefine one or more of those methods on a child class, you need to re-declare the property using the child class' version of the method(s).

    0 讨论(0)
  • 2020-12-12 18:51

    Something like this will work

    class HackedProperty(object):
        def __init__(self, f):
            self.f = f
        def __get__(self, inst, owner):    
            return getattr(inst, self.f.__name__)()
    
    class Foo(object):
        def _get_age(self):
            return 11
        age = HackedProperty(_get_age)
    
    class Bar(Foo):
        def _get_age(self):
            return 44
    
    print Bar().age
    print Foo().age
    
    0 讨论(0)
提交回复
热议问题