【问题标题】:How to override a property getter in Python如何在 Python 中覆盖属性获取器
【发布时间】:2015-08-18 22:31:54
【问题描述】:

我有一个具有名为 sessionID 的属性的类。我从那个类派生了一个新类,并希望在属性获取器和属性设置器中实现一些其他功能。我似乎让属性设置器正常工作,但由于某种奇怪的原因,getter 总是在基类上执行 getter。你们中的任何人都知道我做错了什么,或者我可以改变什么“

基类:

class workflowerAPIBase(object):
    _sessionID = None
    _IP        = None

    @property
    def sessionID(self):
        return self._sessionID

    @sessionID.setter
    def sessionID(self, value):
        self._sessionID = value

后代类:

class workflowerAPI(workflowerAPIBase):
    session = None

    @property
    def sessionID(self):
        # Try to get the previous sessionID from the Session ... 
        # we will still have to check if that sessionID is valid though
        if ( 'sessionID' in self.session ):
            self._sessionID = self.session['sessionID']

        # If no sessionID was found, try to use a default one for now
        # by generating a loginPrintersCloud using default login info
        if ( self._sessionID == None ) or ( self._sessionID == '' ):
            result = self.defaultlogin
            self._sessionID = result['sessionID']

        return self._sessionID

    @workflowerAPIBase.sessionID.setter
    def sessionID(self, value):
        # Store the new sessionID in our session for later use
        if ( self.session != None ):
            self.session['sessionID'] = value

        # call the inherited sessionID setter
        workflowerAPIBase.sessionID.fset( self, value )
        #super(workflowerAPI, self).sessionID(self, value)
#        self._sessionID = value

    def __init__(self, request):
        if request != None and request.session != None and request.session.has_key('sessionID'):
            self.session   = request.session
            self.sessionID = request.session['sessionID']

        super(workflowerAPI, self).__init__()

我不确定自己做错了什么,但每次读取 sessionID 属性的值时,它似乎都会调用 workflowerAPIBase 上的 getter,尽管我正在创建 worflowerAPI 的实例。

【问题讨论】:

  • 您是否尝试过使用 sessionID = property(getSessionID, setSessionID) 并定义两个方法 getSessionID(self) 和 setSessionID(self, value)?通过这种方式,您可以覆盖子类中的 getter 方法,它应该可以按预期工作。
  • 您正在重新定义 def sessionID(self, value)(有 2 个 def 语句),因此覆盖了 workflowerAPI 中该函数的第一个定义。
  • 你能把这个简化为一个更简单的例子吗?您发布的大多数代码与该问题并不真正相关。另外,您是否阅读过关于 SO 的其他关于覆盖属性的问题?

标签: python inheritance properties


【解决方案1】:

在 Python 中,您不会覆盖方法,您只需通过派生类中的新方法隐藏原始方法。另一方面,装饰器只是函数调用的语法糖。所以

@workflowerAPIBase.sessionID.setter
def sessionID(self, value):
    ...

简称

def set_sessionID(self, value):
    ...
sessionID = workflowerAPIBase.sessionID.setter(set_sessionID)

您使用来自基类的 getter 和来自派生类的 setter 设置 sessionID。正确的很简单:

@sessionID.setter
def sessionID(self, value):
    ...

【讨论】:

  • 问题询问如何覆盖getter,而不是setter。
猜你喜欢
  • 2011-11-06
  • 1970-01-01
  • 2014-01-17
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多