Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何为继承类中的所有方法设置参数_Python 3.x_Oop_Inheritance_Python Requests - Fatal编程技术网

Python 3.x 如何为继承类中的所有方法设置参数

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

我目前正在学习Python中的面向对象编程。在理解如何传递给从Parten类继承的所有方法时,我遇到了一些问题。我将向您展示代码示例

下面您可以看到我的父类(它是简单的api包装器)

下面是我的子类,我想从
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
为符号参数提供默认值。各位,请看下面我的答案。我认为我们彼此不了解,或者我只是不知道如何实施您的解决方案。非常感谢。你刚刚澄清了许多我不明白的未知数。