我需要从Client
模块扩展类SUDS
...例如,我有这个简单的代码可以正常工作
client = Client(wsdl, username = USERNAME, password = PASSWORD, headers = {'Content-Type': 'application/soap+xml'}, plugins = [VapixHelper()])
rules = client.service.GetActionRules()
所以我需要为这个类添加一些额外的方法,所以我尝试这样做:
class Vapix(Client):
def __init__(self, args):
globals().update(vars(args))
USERNAME, PASSWORD = user_data.split(':')
super(Vapix, self).__init__(wsdl, username = USERNAME, password = PASSWORD, headers = {'Content-Type': 'application/soap+xml'}, plugins = [VapixHelper()])
def setActionStatus(self, status):
print super(Vapix, self).service.GetActionRules()
我得到这个错误而不是结果:
Traceback (most recent call last):
File "vapix.py", line 42, in <module>
client.setActionStatus(True)
File "vapix.py", line 36, in setActionStatus
print super(Vapix, self).service.GetActionRules()
AttributeError: 'super' object has no attribute 'service'
答案 0 :(得分:2)
您没有覆盖service()
方法,因此您无需使用super()
来查找原始方法;移除super()
来电并直接在self
上访问该属性:
def setActionStatus(self, status):
print self.service.GetActionRules()
仅当您需要在方法(或其他描述符对象)的基类(在方法解析顺序,MRO中)中搜索时,才需要 super()
,这通常是因为当前类已重新定义该名称。
如果您需要调用基类foo
,但当前类实现foo
方法,则您无法使用self.foo()
,而是需要使用super()
。您 使用super()
作为__init__
;您的派生类有自己的__init__
方法,因此调用self.__init__()
将递归调用相同的方法,但super(Vapix, self).__init__()
有效,因为super()
查看self
的MRO ,在该排序中找到Vapix
,然后寻找具有__init__
方法的下一个类。
此处service
是实例属性;它直接在self
上定义,甚至不是一种方法。