[英]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.