类继承:访问子类中的父类参数?

时间:2018-01-08 23:24:00

标签: python python-2.7 oop inheritance

我试图围绕如何在我编写API的代码中利用继承。我有以下父类,它包含一堆常见变量,我想要实例化一次,并继承其他类以使我的代码看起来更清晰:

class ApiCommon(object):
    def __init__(self, _apikey, _serviceid=None, _vclversion=None,
                 _aclname=None, _aclid=None):
        self.BaseApiUrl = "https://api.fastly.com"
        self.APIKey = _apikey
        self.headers = {'Fastly-Key': self.APIKey}
        self.ServiceID = _serviceid
        self.VCLVersion = _vclversion
        self.ACLName = _aclname
        self.ACLid = _aclid
        self.Data = None
        self.IP = None
        self.CIDR = None
        self.fullurl = None
        self.r = None
        self.jsonresp = None
        self.ACLcomment = None
        self.ACLentryid = None

我在下面的另一个类中继承它,就像在一个名为lib/security.py的lib文件中一样:

from apicommon import ApiCommon

class EdgeAclControl(ApiCommon):
    def __init__(self):
        super(EdgeAclControl, self).__init__()

    ...
    def somemethodhere(self):
        return 'stuff'

当我为ApiCommon(object)实例化对象时,我无法访问EdgeAclControl(ApiCommon)中的方法。我正在尝试哪些不起作用的例子:

from lib import security

gza = security.ApiCommon(_aclname='pytest', _apikey='mykey',
                        _serviceid='stuffhere', _vclversion=5)

gza.somemethodhere()

如何实例化ApiCommon并有权访问EdgeAclControl中的方法?

2 个答案:

答案 0 :(得分:2)

您当前的代码似乎试图向后使用继承。创建ApiCommon的实例时,它只会获取该基类中定义的方法。如果要从子类获取方法,则需要创建子类的实例。

因此,您需要做的第一个修复是将gza = security.ApiCommon(...)更改为gza = EdgeAclControl(...)(尽管取决于您执行导入的方式,您可能需要在类名前加上一个模块)。

第二个问题是你的EdgeAclControl类没有采用其基类所需的参数。您当前的代码没有将任何参数传递给super(...).__init__,由于需要_apikey参数,因此该参数无法正常工作。您可以在子类中重复所有参数,但很多时候它更容易使用变量参数语法。

我建议您将EdgeAclControl.__init__更改为接受*args和/或**kwargs,并在调用其父{m} __init__方法时传递这些变量参数super。这看起来像这样:

def __init__(self, *args, **kwargs):
    super(EdgeAclControl, self).__init__(*args, **kwargs)

请注意,如果在本示例中除了在派生的__init__方法中调用父__init__方法之外没有做任何其他操作,只需删除即可获得相同的效果完全衍生的版本!

您的真实代码可能会在EdgeAclControl.__init__中执行某些操作,因此您可能需要以某种形式保留它。请注意,除了*args**kwargs之外,它还可以正常使用参数。只要记住在调用基类时传递额外的参数。

答案 1 :(得分:0)

请问您为什么要实例化ApiCommon对象?我认为没有任何意义。

如果你坚持这样做,你必须在超类中添加方法,然后子类可以覆盖这些方法。但您仍然无法从EdgeAclControl对象

访问ApiCommon的方法