[英]Class inheritance: Access parent class arguments in a subclass?
我正在尝试将我的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
?
您当前的代码似乎正在尝试向后使用继承。 当创建ApiCommon
的实例时,它将仅获取该基类中定义的方法。 如果要从子类获取方法,则需要创建子类的实例。
因此,您需要做的第一个修复是将gza = security.ApiCommon(...)
更改为gza = EdgeAclControl(...)
(尽管根据您执行导入的方式,您可能需要在类名前添加前缀与模块)。
第二个问题是EdgeAclControl
类没有采用其基类所需的参数。 您当前的代码未将任何参数传递给super(...).__init__
,这是无效的,因为需要_apikey
参数。 您可以在子类中再次重复所有参数,但是在许多情况下,使用变量参数语法更容易。
我建议您更改EdgeAclControl.__init__
以接受*args
和/或**kwargs
并在它们使用super
调用其父级的__init__
方法时传递这些变量参数。 看起来像这样:
def __init__(self, *args, **kwargs):
super(EdgeAclControl, self).__init__(*args, **kwargs)
请注意,如在本示例中那样,除了在派生的__init__
方法中调用父__init__
方法之外,您没有做任何其他事情,您可以通过完全删除派生的版本来获得相同的效果!
您的真实代码很可能在EdgeAclControl.__init__
执行了某些EdgeAclControl.__init__
,因此您可能需要将其保留为某种形式。 请注意,除了*args
和**kwargs
之外,它还可以正常接收其他*args
。 只要记住,在调用基类时,如有必要,传递额外的参数。
请问为什么必须实例化一个ApiCommon
对象? 我看不到这样做的任何意义。
如果您坚持要这样做,则必须在超类中添加方法,然后子类可能会覆盖这些方法。 但是您仍然无法从ApiCommon
对象访问EdgeAclControl
方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.