【发布时间】: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