向 python 对象添加属性

发布于 2024-11-05 06:58:09 字数 408 浏览 0 评论 0原文

这是一件困扰我一段时间的事情。为什么我不能做:

>>> a = ""
>>> a.foo = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'foo'

...而我可以做以下事情?

>>> class Bar():
...     pass
... 
>>> a = Bar()
>>> a.foo = 10 #ok!

这里有什么规则?您能给我一些描述吗?

It's a thing that bugged me for a while. Why can't I do:

>>> a = ""
>>> a.foo = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'foo'

...while I can do the following?

>>> class Bar():
...     pass
... 
>>> a = Bar()
>>> a.foo = 10 #ok!

What's the rule here? Could you please point me to some description?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明媚如初 2024-11-12 06:58:09

您可以向任何具有 __dict__ 的对象添加属性。

  • 例如,x = object() 就没有它。
  • 字符串和其他简单的内置对象也没有它。
  • 使用 __slots__ 的类也没有它。
  • 除非前面的语句适用,否则使用 class 定义的类都具有它。

如果一个对象使用 __slots__ / 没有 __dict__ ,通常是为了节省空间。例如,在 str 中,拥有一个字典就太过分了——想象一下非常短的字符串的膨胀量。

如果要测试给定对象是否具有 __dict__,可以使用 hasattr(obj, '__dict__')

读起来可能也很有趣:

某些对象,例如内置类型及其实例(列表、元组等)没有 __dict__。因此无法在它们上设置用户定义的属性。

另一篇关于Python数据模型(包括__dict____slots__等)的有趣文章是this 来自 python 参考。

You can add attributes to any object that has a __dict__.

  • x = object() doesn't have it, for example.
  • Strings and other simple builtin objects also don't have it.
  • Classes using __slots__ also do not have it.
  • Classes defined with class have it unless the previous statement applies.

If an object is using __slots__ / doesn't have a __dict__, it's usually to save space. For example, in a str it would be overkill to have a dict - imagine the amount of bloat for a very short string.

If you want to test if a given object has a __dict__, you can use hasattr(obj, '__dict__').

This might also be interesting to read:

Some objects, such as built-in types and their instances (lists, tuples, etc.) do not have a __dict__. Consequently user-defined attributes cannot be set on them.

Another interesting article about Python's data model including __dict__, __slots__, etc. is this from the python reference.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文