如何正确扩展python中的类和使用父类?

时间:2014-03-28 07:45:22

标签: python python-2.7

我需要从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'

1 个答案:

答案 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上定义,甚至不是一种方法。