我有两个类Route
和Factors
。Route
包含Factors
的一个值和三个副本。Route
不知道Factors
包含多少个变量。我想获得这些变量的名称,然后获得每个变量的相应值,对于Factors
的每个副本。
以下是我目前拥有的:
@dataclass
class Factors:
do: bool # does it do the route
hub: int # how many of the locations are hubs
def __init__(self, do_init):
self.do = do_init
self.hub = 0 # will add later
def __str__(self):
return "%s" % self.do
@dataclass
class Route:
route: tuple
skyteam: Factors
star: Factors
oneworld: Factors
def __init__(self, route):
self.route = route.get('route')
# this could probably be done with one line loop and a variable with names
self.skyteam = Factors(route.get('skyteam'))
self.star = Factors(route.get('star'))
self.oneworld = Factors(route.get('oneworld'))
def __str__(self):
table = [[self.route, "SkyTeam", "StarAlliance", "OneWorld"]] # var name is fine
for var in Factors.__dict__.get('__annotations__').keys(): # for each factor
factor = [var]
factor.append(self.skyteam.__dict__.get(var))
factor.append(self.star.__dict__.get(var))
factor.append(self.oneworld.__dict__.get(var))
table.append(factor)
return tabulate.tabulate(table, tablefmt='plain')
字符串
输入
{'route': ('BOS', 'DXB'), 'skyteam': True, 'star': True, 'oneworld': True}
型
电流输出
('BOS', 'DXB') SkyTeam StarAlliance OneWorld
do True True True
hub 0 0 0
型
也许我可以在Route
中搜索每个包含Factors
数据类型的变量,然后在这些变量上搜索?
6条答案
按热度按时间uyhoqukh1#
你可以用玻璃。
字符串
kgsdhlau2#
我还使用了
__dataclass_fields__
,它返回变量名及其类型的dict。例如:字符串
xxslljrj3#
可能最简单的方法是从
dataclasses
导入asdict
,然后写这样的代码:字符串
对于一个小的类,将类对象复制到一个新字典的成本远远超过了它的方便性和可读性。
3htmauhk4#
我不去管内置的
__str__
s,只在Route
类上调用函数visualize
或其他东西,但这是有品味的。你也不应该重载__init__
类,除非你绝对需要,只要把你的输入dict放在默认的构造函数中。最后一点,尝试使用
getattr
/setattr
访问__dict__
,__slots__
存储它们的属性是很流行的,这会以一种不平凡的方式破坏你的代码。所以我会使用类似这样的东西,使用tabulate库来处理渲染:
字符串
这对你的例子来说很好:
型
如果您向Factor类添加更多字段,并向Route添加更多因子示例,此解决方案应继续有效。
vkc1a9a25#
为了访问类本身中的字段,我尝试了以下操作。
字符串
aoyhnmkz6#
要遍历键值对,可以将此方法添加到类中:
字符串
然后像往常一样循环:
型