【发布时间】:2016-04-21 11:21:36
【问题描述】:
下面是两个类,显示了我正在处理的 API 的继承。因此,我希望基类 ServiceTemplateTest 为所有服务 和 提供一组通用属性,使其表现得像 OrderedDict 对象。所以基类继承自 OrderedDict。然后我在__init__ 中执行super() 以解决MRO 问题。现在,当我实际使用这个基类时,当我尝试从基类中对__init() 进行分类时遇到了问题。根据我的调试器,它说我需要调用:self._ServiceTemplateTest__init(),但不应该只是__init(),因为我调用了 super()?什么是让我无需进行此调用即可继承的正确方法:self._ServiceTemplateTest__init()?
我是否需要在我有多个 super() 调用的非基类上创建一个__init__()?如果是这样,什么超类应该首先出现?
感谢您提供的任何建议!
from collections import OrderedDict
import urllib2, json, urllib
class ServiceTemplateTest(OrderedDict):
_con = None
_url = None
def __init__(self, url, connection=None, initialize=False, **kwargs):
super(ServiceTemplateTest, self).__init__()
self._url = url
self._con = connection
if initialize:
self.__init(connection)
def __init(self, connection=None):
if connection is None:
connection = self._con
attributes = [attr for attr in dir(self)
if not attr.startswith('__') and \
not attr.startswith('_')]
params = {"f":"json"}
params = urllib.urlencode(params)
result = json.loads(
urllib2.urlopen(url="{url}?{params}".format(url=self._url,
params=params)).read())
for k,v in result.items():
if k in attributes:
setattr(self, "_"+ k, v)
self[k] = v
else:
self[k] = v
self.__dict__.update(result)
#----------------------------------------------------------------------
@property
def connection(self):
return self._con
#----------------------------------------------------------------------
@connection.setter
def connection(self, value):
self._con = value
self.refresh()
#----------------------------------------------------------------------
@property
def url(self):
return self._url
#----------------------------------------------------------------------
@url.setter
def url(self, value):
""""""
self._url = value
self.refresh()
#----------------------------------------------------------------------
def __str__(self):
return json.dumps(self)
#----------------------------------------------------------------------
def __repr__(self):
return self.__str__()
#----------------------------------------------------------------------
def refresh(self):
self.__init()
class SchematicService(ServiceTemplateTest):
"""schematic service"""
_con = None
_json_dict = None
_json = None
_url = None
_nbSchematicLayers = None
_nbTemplates = None
_type = None
_name = None
_nbEstimatedDiagrams = None
def __init__(self, url, connection=None, initialize=False, **kwargs):
super(SchematicService, self).__init__(url=url, connection=connection,
initialize=initialize, **kwargs)
self._url = url
self._con = connection
if initialize:
self.__init(connection)
#----------------------------------------------------------------------
@property
def nbSchematicLayers(self):
if self._nbSchematicLayers is None:
self.__init()
return self._nbSchematicLayers
#----------------------------------------------------------------------
@property
def nbTemplates (self):
if self._nbTemplates is None:
self.__init()
return self._nbTemplates
#----------------------------------------------------------------------
@property
def type(self):
if self._type is None:
self.__init()
return self._type
#----------------------------------------------------------------------
@property
def name(self):
if self._name is None:
self.__init()
return self._name
#----------------------------------------------------------------------
@property
def nbEstimatedDiagrams(self):
if self._nbEstimatedDiagrams is None:
self.__init()
return self._nbEstimatedDiagrams
@property
def somerandompropertytest(self):
return "hi"
if __name__ == "__main__":
url = "http://servicesbeta6.esri.com/arcgis/rest/services/S1_Schematics/MapServer"
s = SchematicService(url=url, initialize=True)
print s
【问题讨论】:
标签: python python-2.7 super