Python: 如何使用来自不同 class 的属性

Python: how to use attribute from differenct class

我在trader.py中有一些基本的classTrader:

class Trader(object):
    def __init__(self, exchange_name, api_key, api_secret):
        self.Exchange = Exchange(exchange_name, api_key, api_secret).exchange

和 class Exchangeexchange.py

class Exchange(object):
    def __init__(self, name, api_key, api_secret):
        self.name = name
        exchange_id = name
        exchange_class = getattr(ccxt, exchange_id)
        self.exchange = exchange_class({
            'apiKey': api_key,
            'secret': api_secret,
            'timeout': 30000,
            'enableRateLimit': True,
        })

以上有效。所以我可以在 Trader class 中使用 self.Exchange 来使用针对交易所的功能。但它只因为这一行才有效:

self.Exchange = Exchange(exchange_name, api_key, api_secret).exchange

我不喜欢我必须在它后面加上 .exchange。我只是在玩和学习 python。我在 python 编程方面不是很有经验/我也不是硬币交易员,但我喜欢 ccxt 包。

如何在不需要将 .exchange 放在我的 Exchange(...) 后面的情况下完成这项工作,或者这是正常行为吗?还是我必须以不同的方式进行交换 class?

谢谢

you need to create an instance if you would like to use an attribute from another class

myInstance = Exchange()
print(myInstance.exchange_id) if you would like to print the name

the scope is local you could also declare a variable global before assigning its value if you would like to use it outside the function or class it is created in

因为 exchangeExchange class 实例的属性,这是正常行为。

如果您想访问 exchange 而无需在 Exchange 对象后放置 .exchange,您可以考虑取消 Exchange class完全——因为你似乎只用它来从 ccxt 获取 exchange_class 的实例——而是编写一个函数。

这是一个例子:

def get_exchange(exchange_name, api_key, api_secret):
    exchange_class = getattr(ccxt, exchange_id)
    return exchange_class({
        'apiKey': api_key,
        'secret': api_secret,
        'timeout': 30000,
        'enableRateLimit': True,
    })

class Trader:
    def __init__(self, exchange_name, api_key, api_secret):
        self.exchange = get_exchange(exchange_name, api_key, api_secret)

这样 exchange 将可以直接被 Trader 的实例访问。