什么是python中的“属性的动态赋值”?

What is "dynamic assignment of an attribute" in python?

提问人:roulette01 提问时间:8/30/2023 最后编辑:roulette01 更新时间:8/30/2023 访问量:92

问:

我很少使用 Python,所以也许我只是不知道一些措辞。在今天的一次演讲中,有人说他们希望避免“属性的动态分配”,但没有提供示例。

我知道动态创建类的属性意味着什么,但是动态赋值是什么意思?这似乎意味着 python 中有静态赋值,但 python 是一种动态类型语言。

Python 术语

评论

2赞 Mike 'Pomax' Kamermans 8/30/2023
它只是意味着将值分配给名称为字符串的属性(可以只是一个字符串,也可以是动态构造的东西),而不是在源中具有属性名称,例如 而不是 .这通常是将未来的错误烘焙到代码中的绝妙方法。setattr(cake, f'{ingr}{id}', 7)cake.eggs = 7
0赞 Brian61354270 8/30/2023
这听起来像是“动态赋值”,原始来源意味着“动态地向对象添加新属性”。这与预先定义所有属性形成鲜明对比,例如在类体内部或使用注释。基本上,您应该能够通过浏览定义来判断类的实例将具有哪些属性。__init__
0赞 roulette01 8/30/2023
@Mike'Pomax'Kamermans啊,我明白了。所以你的意思是这个类中的属性从未在类定义中被引用过?
0赞 dROOOze 8/30/2023
python is a dynamically typed language不,最流行的实现 (CPython) 的“语言默认值”允许动态行为。您可以使用 Python(甚至 CPython)作为静态类型语言;例如,添加到基类将防止将任意命名的属性添加到实例中,并且使用 mypy 和 pyright 的静态类型现在非常普遍(至少在开源社区中)。__slots__
0赞 juanpa.arrivillaga 8/30/2023
@dROOOze不,Python 在设计上是一种动态类型语言,这不是一个实现细节。 不会降低 Python 的动态类型。使用第三方静态分析工具不会降低 python 的动态类型__slots__

答:

3赞 juanpa.arrivillaga 8/30/2023 #1

通常,这意味着属性本身是动态创建的字符串,然后分配给实例:

class Foo:
...     pass
...
>>> foo = Foo()
>>> attr = "some_dynamically_created_string"
>>> setattr(foo, attr, 42)
>>> foo.some_dynamically_created_string
42

评论

0赞 roulette01 8/30/2023
哦,嗯,我以为他们只意味着赋值部分,并且已经创建了属性。在您的示例中,是否从未在实际的类定义中显示?如果他们只是在类定义之外创建这样的属性,这似乎很难理解attrFoo
0赞 juanpa.arrivillaga 8/30/2023
@roulette01听起来像是应该避免它们的一个很好的理由!请注意,在 Python 中,如果没有赋值,则无法创建属性...属性只有在首次被赋值时才会存在!