如何解决如何为继承的类中的所有方法设置参数
我目前正在学习Python中的面向对象编程。我在理解如何传递到从Parten类继承的所有方法时遇到一些问题。我将向您展示代码示例。
在下面,您可以看到我的Parent类(它是简单的api包装器)。
class AlphaVantageClient:
_URL = "https://www.alphavantage.co/query?"
def __init__(self,api_key=None):
self.__api_key = api_key
def show_base_url(self):
print(self._URL)
def set_api_key(self,api_key: str):
self.__api_key = api_key
def __call_api(self,query_parameters: dict,**kwargs):
"""
The structure looks like:
co./query?function{}&symbol{}
:param query_parameters:
:return: response
"""
query_parameters["apikey"] = self.__api_key
response = requests.get(
AlphaVantageClient._URL,params=query_parameters,proxies=self.__proxy
)
validate_http_status(response)
return response.json()
def company_overview(self,ticker: str,**kwargs):
query_parameters = {
"function": "OVERVIEW","symbol": ticker
}
return self.__call_api(query_parameters,**kwargs)
def balance_sheet(self,**kwargs):
query_parameters = {
"function": "BALANCE_SHEET",**kwargs)
def income_statement(self,**kwargs):
query_parameters = {
"function": "INCOME_STATEMENT",**kwargs)
def cash_flow(self,**kwargs):
query_parameters = {
"function": "CASH_FLOW",**kwargs)
下面是我的子类,我想在其中子类继承自AlphaVantageClient
类的所有方法。
class Stock(AlphaVantageClient):
def __init__(self,ticker: str):
super().__init__()
self.ticker = ticker
self.client = AlphaVantageClient()
def set_api_key(self,api_key):
self.client.set_api_key(api_key)
但是我的问题是,正如您在AlphaVantegeClient
中看到的那样,我的所有方法都具有参数symbol
,我想为所有方法设置一行或类似内容以使我的{ symbol
类中的{1}}参数设置为self.ticker
。有可能这样做吗?还是我需要以某种方式重构父类代码?
解决方法
您误解了继承的工作原理。当您创建一个类Stock
的子类(继承自该类)时,它会自动获取该父类的所有属性和方法,就像您将它们定义为新子类的一部分一样。
您绝对不应在初始化中包含以下行:AlphaVantageClient
。通过从self.client = AlphaVantageClient()
进行子类化(继承),它已经是AlphaVantageClient
的实例,并创建了一个单独的和和AlphaVantageClient
的单独实例。
在您的AlphaVantageClient
类中,您不必重新定义Stock
,除非您出于某种原因试图更改它,而并非如此。此方法只是试图将set_api_key()
保存到内部类属性中,并且已经做到了,因此只需将其保留/在api_key
中未定义即可。
您不需要重做Stock
,但是您确实需要在AlphaVantageClient
中包含存根,因为它们需要将保存的Stock
参数替换为对父级的调用。像这样:
ticker
,
谢谢您的回答。我不知道我是否正确。
class AlphaVantageClient:
_URL = "https://www.alphavantage.co/query?"
def __init__(self,api_key=None,symbol=None):
self.__api_key = api_key
self.__proxy = {}
self.__validate_api_key()
self.__data_type = 'json'
self.__symbol = symbol
def set_api_key(self,api_key: str):
self.__api_key = api_key
def __call_api(self,query_parameters: dict,**kwargs):
"""
The structure looks like:
co./query?function{}&symbol{}
:param query_parameters:
:return: response
"""
query_parameters["apikey"] = self.__api_key
response = requests.get(
AlphaVantageClient._URL,params=query_parameters,proxies=self.__proxy
)
validate_http_status(response)
return response.json()
def company_overview(self,symbol: str,**kwargs):
query_parameters = {
"function": "OVERVIEW","symbol": symbol
}
return self.__call_api(query_parameters,**kwargs)
def balance_sheet(self,**kwargs):
query_parameters = {
"function": "BALANCE_SHEET",**kwargs)
def income_statement(self,**kwargs):
query_parameters = {
"function": "INCOME_STATEMENT",**kwargs)
def cash_flow(self,**kwargs):
query_parameters = {
"function": "CASH_FLOW",**kwargs)
class Stock(AlphaVantageClient):
def __init__(self,symbol: str):
super().__init__(symbol)
self.symbol = symbol
self.client = AlphaVantageClient(symbol)
def set_api_key(self,api_key):
self.client.set_api_key(api_key)
现在我的课程看起来像这样。然后,我尝试创建类的实例并调用以下方法之一:
from client import AlphaVantageClient,Stock
stock = Stock(symbol="FB")
stock.income_statement()
我得到一个错误:
tests\test_client.py:5: in <module>
stock.income_statement()
E TypeError: income_statement() missing 1 required positional argument: 'symbol'
所以我不知道我是否理解不正确,或者我只是以错误的方式解释了我的问题。因此,我将再次尝试:
如果我调用AlphaVantageClient
,我想以创建该类实例的方式使用它,并调用提供作为股票参数符号的方法,例如
client = AlphaVantageClient()
income_statement = client.income_statement(symbol="FB")
但是如果我创建一个Stock
类,我希望将符号存储在类中,并且不需要在我的方法中将其作为参数提供:所有方法都应使用我在我提供的符号默认创建了Stock
类。因此用法应如下所示:
stock = Stock(symbol="FB")
income_statement = stock.income_statement()
这样,我将在所有方法中获取“ FB”的数据。
有可能吗?如果是的话,您能再给我解释一下如何实现吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。