簡體   English   中英

類繼承:訪問子類中的父類參數?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM