我试图围绕如何在我编写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
中的方法?
答案 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
的方法