解压一个类[重复]

2024-02-14

我想创建一个类来像字典一样解压它的对象。

例如,使用字典,您可以这样做

foo = {
  "a" : 1
  "b" : 2
}

def bar(a,b):
   return a + b

bar(**foo)

outputs 3

我希望能够做到这一点

class FooClass:
    def __init__(self):
        self.a = a
        self.b = b

f = FooClass()
bar(**f)

并让它输出3

This https://stackoverflow.com/questions/37837520/implement-packing-unpacking-in-an-object是我能找到的最相关的问题,但它没有解决这个问题,所以我认为这可能是不可能的。


目前我的解决方案是这样的:

class FooClass:
    def __init__(self):
        self.a = a
        self.b = b

    def to_dict(self):
        return {
          "a" : self.a,
          "b" : self.b
        }
f = FooClass()
bar(**f.to_dict())

正如评论中指出的,编写一个一致的子类collections.abc.Mapping https://docs.python.org/3/library/collections.abc.html#collections.abc.Mapping抽象类是要走的路。要(具体地)子类化此类,您需要实现__getitem__, __len__, and __iter__像字典一样表现一致。所以这意味着__getitem__期望一个字符串,__iter__返回字符串的可迭代对象等。

举一个简单的例子,我们将把所有这些简单地委托给self.__dict__,但在实际代码中,您可能想做一些更精致的事情。

from collections.abc import Mapping

class FooClass(Mapping):

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __getitem__(self, x):
        return self.__dict__[x]

    def __iter__(self):
        return iter(self.__dict__)

    def __len__(self):
        return len(self.__dict__)

def bar(a, b):
    return a + b

foo = FooClass(40, 2)
print(bar(**foo))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解压一个类[重复] 的相关文章

随机推荐