在Python模块的文档中attrs 指出,有一种方法可以将属性的类转换为字典表示形式:
例:
>>> @attr.s
... class Coordinates(object):
... x = attr.ib()
... y = attr.ib()
...
>>> attr.asdict(Coordinates(x=1, y=2))
{'x': 1, 'y': 2}
Run Code Online (Sandbox Code Playgroud)
如何实现对立面:Coordinates从有效的字典表示形式中获取的实例,而不使用样板内容,并且对attrs模块感到满意?
我有两个非常类似的类:A和B:
import attr
@attr.s
class A(object):
x = attr.ib()
y = attr.ib()
@attr.s
class B(object):
x = attr.ib()
z = attr.ib()
y = attr.ib(default=None)
Run Code Online (Sandbox Code Playgroud)
如您所见,它们共享2个属性(x和y),但在类A中,y属性是位置,而在B中它是可选的.
我想在一个超类中对这些类进行分组,但如果我尝试使类继承自类AI,则会出现以下错误:
SyntaxError: duplicate argument 'y' in function definition
Run Code Online (Sandbox Code Playgroud)
添加了用于引发错误的代码:
@attr.s
class A(object):
x = attr.ib()
y = attr.ib()
@attr.s
class B(A):
z = attr.ib()
y = attr.ib(default=None)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是否可以使用attrs模块将这些类组合在一个超类中?如果不是,你会建议我将它们分组为"旧时尚"方式(我自己实施init方法)吗?
非常感谢!
我有:
@attr.s
class Example:
number = attr.ib(validator=attr.validators.instance_of(int), init=False)
def __attrs_post_init__(self):
self.number = 'string'
print('It seems, validation was running before:(')
t = Example()
Run Code Online (Sandbox Code Playgroud)
这里如何正确设置验证?我想在实例化后验证 self.number。
我刚开始使用attrsPython 模块,它非常漂亮(或者类似地,我们可以使用 Python 3.7 DataClasses)。我有一个常见的使用模式是让类成为参数值的容器。我喜欢分配参数时的标签,以及更清晰的属性样式引用值,但我也喜欢在将值存储在有序 dict 之类的东西中时有几个很好的功能:
*像 atuple或 a一样解包list以输入函数参数** 当需要或需要传递关键字时解压缩。我可以通过在类中添加三个方法来实现这一切
@attr.s
class DataParameters:
A: float = attr.ib()
alpha: float = attr.ib()
c: float = attr.ib()
k: float = attr.ib()
M_s: float = attr.ib()
def keys(self):
return 'A', 'alpha', 'c', 'k', 'M_s'
def __getitem__(self, key):
return getattr(self, key)
def __iter__(self):
return (getattr(self, x) for x in self.keys())
Run Code Online (Sandbox Code Playgroud)
然后我可以使用这样的类:
params = DataParameters(1, 2, 3, 4, 5)
result1 = function1(100, 200, *params, 300) …Run Code Online (Sandbox Code Playgroud) 我想使用 attr 和 cattrs 反序列化 MongoDB 文档。由于 noSQL 没有固定的模式,我需要以某种方式指向 attr.ib-s,它们可能会被遗漏,而不是在这种情况下将它们添加到 dict 的对象中。
我之前使用过漏勺来做这种事情,它在漏勺.SchemaNode 构造函数中提供了一个“缺失”的参数,它通过将“漏勺”作为参数传递来做到这一点。我想知道如何对这些库做同样的事情,我在文档中没有找到任何内容。所以:
import attr
from cattr import structure
@attr.s
class ABC:
A: float = attr.ib()
B: float = attr.ib()
C: float = attr.ib()
d = {'A': 1, 'B': 2}
obj = structure(d, ABC)
Run Code Online (Sandbox Code Playgroud)
应该返回一个只有 A 和 B 属性的对象。我一直在尝试使用一些参数(init、default...),甚至使用来自键入 lib 的 Optional 类,但是我尝试的所有方法都以某种方式返回了该属性。
谢谢你的帮助。