而不是每次定义类时都这样编写代码:
class Foo(object):
def __init__(self, a, b, c, d, e, f, g):
self.a = a
self.b = b
self.c = c
self.d = d
self.e = e
self.f = f
self.g = g
我可以用this recipe for automatic attribute assignment。
class Foo(object):
@autoassign
def __init__(self, a, b, c, d, e, f, g):
pass
两个问题:
有一些关于自动分配代码的问题困扰着我(主要是文体问题,但还有一个更严重的问题):
autoassign
不分配 “args”属性:autoassign
就像一个装饰器。 但是autoassign(*argnames)
调用 返回装饰器的函数。 为了实现这个魔力,autoassign
需要先测试它的类型 争论。如果有选择,我 喜欢不测试的功能 其参数的类型。似乎有相当一部分 用于设置的代码量
sieve
,lambdas中的lambdas, 过滤,还有很多条件。我想可能有一个更简单的方法。(见 下面)。
for _ in itertools.starmap(assigned.setdefault, defaults): pass
。我不认为map
或starmap
应该调用 功能,其唯一目的是 副作用。可能是 写得更清楚些:这里有一个替代的更简单的实现,其功能与autoassign相同(例如,可以包含和排除),并解决了上述问题:
下面是我用来检查其行为的单元测试:
使用
autoassign
或autoargs
与IPython代码完成兼容。我不知道这是否一定更好,但你可以这样做:
承蒙彼得·诺维格的款待。
从Python 3.7+中,您可以使用一个Data Class,它可以实现您想要的以及更多的功能。
它允许您为类定义字段,这些字段是自动分配的属性。
看起来像是这样:
将在类中自动创建
__init__
方法,并将实例创建的参数分配给这些属性(并验证参数)。注意这里需要类型提示,这就是我在示例中使用} module 。
int
和str
的原因。如果不知道字段的类型,可以使用Any from the ^{相关问题 更多 >
编程相关推荐