首页
学习
活动
专区
圈层
工具
发布

解压类
EN

Stack Overflow用户
提问于 2022-02-16 16:14:54
回答 3查看 664关注 0票数 3

我想做一个像字典一样解压缩对象的类。

例如,使用字典就可以做到这一点。

代码语言:javascript
复制
foo = {
  "a" : 1
  "b" : 2
}

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

bar(**foo)

输出3

我希望能做到这一点

代码语言:javascript
复制
class FooClass:
    def __init__(self):
        self.a = a
        self.b = b

f = FooClass()
bar(**f)

并让它输出3

This是我能找到的最相关的问题,但它没有解决这个问题,所以我认为这可能是不可能的。

目前,我的解决办法是:

代码语言:javascript
复制
class FooClass:
    def __init__(self):
        self.a = a
        self.b = b

    def to_dict(self):
        return {
          "a" : self.a,
          "b" : self.b
        }
代码语言:javascript
复制
f = FooClass()
bar(**f.to_dict())
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-16 16:24:40

正如注释中指出的那样,编写collections.abc.Mapping抽象类的一致性子类是可行的。要(具体地)子类这个类,您需要实现__getitem____len____iter__,以保持与字典一样的一致行为。这意味着__getitem__需要一个字符串,__iter__返回一个可迭代的字符串,等等。

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

代码语言:javascript
复制
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))
票数 6
EN

Stack Overflow用户

发布于 2022-02-16 16:24:34

代码语言:javascript
复制
def bar(a, b):
   return a + b
  
class FooClass:
    def __init__(self, a, b):
        self.a = a
        self.b = b

f = FooClass(1, 2)

print(bar(*f.__dict__.values()))

# print(bar(**f.__dict__)) # Also works

输出:

代码语言:javascript
复制
3
票数 1
EN

Stack Overflow用户

发布于 2022-02-16 16:24:58

除了在vars(f)f.__dict__上使用reyling之外,您还可以使用一个数据集。

代码语言:javascript
复制
from dataclasses import dataclass, asdict

@dataclass
class FooClass:
    a: int
    b: int

演示:

代码语言:javascript
复制
>>> f = FooClass(1, 2)
>>> asdict(f)
{'a': 1, 'b': 2}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71145407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档