Python 3.x 如何为继承类中的所有方法设置参数
我目前正在学习Python中的面向对象编程。在理解如何传递给从Parten类继承的所有方法时,我遇到了一些问题。我将向您展示代码示例 下面您可以看到我的父类(它是简单的api包装器) 下面是我的子类,我想从Python 3.x 如何为继承类中的所有方法设置参数,python-3.x,oop,inheritance,python-requests,Python 3.x,Oop,Inheritance,Python Requests,我目前正在学习Python中的面向对象编程。在理解如何传递给从Parten类继承的所有方法时,我遇到了一些问题。我将向您展示代码示例 下面您可以看到我的父类(它是简单的api包装器) 下面是我的子类,我想从AlphaVantageClient类继承所有方法 class Stock(AlphaVantageClient): def __init__(self, ticker: str): super().__init__() self.ticker = ti
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
参数设置为self.ticker
来自Stock
类。有可能吗?或者我需要以某种方式重构父类代码?谢谢您的回答。我不知道我是否理解正确
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, symbol: str, **kwargs):
query_parameters = {
"function": "BALANCE_SHEET",
"symbol": symbol
}
return self.__call_api(query_parameters, **kwargs)
def income_statement(self, symbol: str, **kwargs):
query_parameters = {
"function": "INCOME_STATEMENT",
"symbol": symbol
}
return self.__call_api(query_parameters, **kwargs)
def cash_flow(self, symbol: str, **kwargs):
query_parameters = {
"function": "CASH_FLOW",
"symbol": symbol
}
return self.__call_api(query_parameters, **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()
stock = Stock(symbol="FB")
income_statement = stock.income_statement()
我得到一个错误:
tests\test_client.py:5: in <module>
stock.income_statement()
E TypeError: income_statement() missing 1 required positional argument: 'symbol'
但是,如果我创建一个Stock
类,我希望将符号存储在类中,而不需要在我的方法中提供它作为参数:所有方法都应该使用我在创建Stock
类时提供的符号作为默认值。因此,用法应如下所示:
from client import AlphaVantageClient, Stock
stock = Stock(symbol="FB")
stock.income_statement()
stock = Stock(symbol="FB")
income_statement = stock.income_statement()
这样,我将在所有方法中获取“FB”的数据
可能吗?如果是的话,你能再给我解释一下如何实现它。你误解了继承是如何工作的。创建子类(继承自)类的类
Stock
时,它会自动获取该父类的所有属性和方法,就像您将它们定义为新子类的一部分一样
您绝对不应该在init:self.client=AlphaVantageClient()
中有这一行。通过从AlphaVantageClient
子类化(继承),它已经是AlphaVantageClient
的一个实例,并且创建了一个单独的附加实例,并且AlphaVantageClient
与现有实例分离
在Stock
类中,您不必重新定义set\u api\u key()
,除非您出于某种原因试图对其进行更改,但您没有这样做。此方法只是试图将api_键
保存到内部类属性中,它已经这样做了,因此只需在Stock
中删除它/取消重新定义它即可
您不需要重新编写AlphaVantageClient
,但您需要在Stock
中设置存根,因为它们需要将保存的ticker
参数替换为对父级的调用。像这样:
类别股票(AlphaVantageClient):
定义初始化(self,ticker:str,api_key=None):
super().\uuuu init\uuuu(api\u键)
self.ticker=ticker
def公司概述(自身,**kwargs):
return super().公司概述(self.ticker,**kwargs)
def资产负债表(自身,**kwargs):
return super().资产负债表(self.ticker,**kwargs)
def损益表(自我,**kwargs):
return super().损益表(self.ticker,**kwargs)
def现金流(自身,**kwargs):
return super().现金流(self.ticker,**kwargs)
所以接受AlphaVantageClient中的ticker
。\uuu init\uuuu
并将其存储为self.ticker
,就像你对self所做的那样。\uu api\u key
并且你可以基于self.ticker
为符号参数提供默认值。各位,请看下面我的答案。我认为我们彼此不了解,或者我只是不知道如何实施您的解决方案。非常感谢。你刚刚澄清了许多我不明白的未知数。