从另一个类(嵌套类)的方法中调用方法



这个问题是我昨天在这里问的前一个问题的延续,我试图遵循@jonrsharpe 给出的建议

我想用以下文件跟踪我启动的用户的银行账户

配置yaml

banks:
- name: HSBC
accounts:
- distinct_id: abcd1234
owner:
name: jason
mail: jason.musk@gmail.com
products:
- name: product1
currencies:
- currency: EUR
total: 1009
- currency: USD
total: 809.9
- name: product2
currencies:
- currency: CNY
total: 47966
- currency: USD
total: 9.90

然后,我为每个配置部分(银行、账户、所有者等(创建一个类。因此,这些类按照配置文件的层次结构嵌套。

主.py

import yaml

def load_configurations(path):
with open(path, "r") as stream:
try:
return yaml.safe_load(stream)
except yaml.YAMLError as e:
print(e)

class Currency:
def __init__(self, **kwargs):
self.currency = kwargs['currency']
self.total = kwargs['total']

class Product:
def __init__(self, **kwargs):
self.currencies = {}
for currency in kwargs['currencies']:
self.add_currency(currency['currency'], currency)
def add_currency(self, name, currency):
self.currencies[name] = Currency(**currency)
def get_currency(self, currency):
return self.currencies[currency]

class Owner:
def __init__(self, **kwargs):
self.name = kwargs["name"]
self.mail = kwargs["mail"]

class Account:
def __init__(self, **kwargs):
self.owner = Owner(**kwargs['owner'])
self.products = {}
for product in kwargs['products']:
self.add_product(product['name'], product)
def add_product(self, name, product):
self.products[name] = Product(**product)
def get_product(self, name):
return self.products[name]
def get_owner(self):
return self.owner

class Bank:
def __init__(self, **kwargs):
self.accounts = {}
for account in kwargs['accounts']:
self.add_account(account['distinct_id'], account)
def add_account(self, name, account):
self.accounts[name] = Account(**account)
def get_account(self, distinct_id):
return self.accounts[distinct_id]

class Configuration:
def __init__(self, **kwargs):
self.banks = {}
for bank in kwargs['banks']:
self.add_bank(bank['name'], bank)
def add_bank(self, name, bank):
self.banks[name] = Bank(**bank)
def get_bank(self, name):
return self.banks[name]

path_configuration = "config.yaml"
config_global = load_configurations(path_configuration)
env = Configuration(**config_global)

我现在希望能够为用户查询特定帐户的现有余额。我可以通过两种方式做到这一点:

  • 通过映射:
result = env.banks['HSBC'].accounts['abcd1234'].products['product1'].currencies['USD'].total
print(result)
  • 或者通过以下方法:
result = env.get_bank('HSBC').get_account('abcd1234').get_product('product1').get_currency('USD').total
print(result)

通过浏览这些方法(比映射更明确(,我希望我的IDE(Pycharm(能为我提供每个类/对象可用的方法。它为我的第一个Configuration((类提供了get_bank((方法。。。但不要为其他人这样做。我该怎么解决这个问题?

您还没有说明您正在使用哪个IDE,所以我只提供一些一般性建议。

Python是动态类型的,这意味着函数可以返回它想要的任何内容,而不必事先声明。因此,通常情况下,IDE在不运行函数本身的情况下无法判断函数返回的内容,这样做意味着计算可能会终止,也可能不会终止。

话虽如此,您可以向Python提供类型提示,静态分析工具可以使用这些提示来确定返回值。这可能看起来像

from typing import Any, Dict
class Configuration:
banks: Dict[str, Bank]
def __init__(self, **kwargs: Any) -> None:
self.banks = {}
for bank in kwargs['banks']:
self.add_bank(bank['name'], bank)
def add_bank(self, name: str, bank: Bank) -> None:
self.banks[name] = Bank(**bank)
def get_bank(self, name: str) -> Bank:
return self.banks[name]

然后,您的IDE可能会接收到这些签名。但同样,这取决于你运行的编辑器以及它的高级程度

最新更新