【问题标题】:Why I can Assign a attributes to a class instance, even this attributes is not defined in class?为什么我可以将属性分配给类实例,即使该属性未在类中定义?
【发布时间】:2015-07-16 13:39:36
【问题描述】:

这背后是怎样的机制?

例如,我可以定义一个类

class test:
    string_a="aaa"

然后我可以为类测试设置一个实例。

test_instance=test()

稍后我可以将 test_attr 分配给 test_instance。

test_instance.test_attr="bbb"
print test_instance.test_attr

这将打印,"bbb"

那么行为是为了什么?与__init__ 有什么冲突吗?

谢谢。

【问题讨论】:

  • 这是否意味着如果不需要创建一个子类来表示一些特殊的实例情况,那么我可以将私有属性附加到我想要使用的类实例上?所以这很好吗?
  • link abarnert 了解更多信息,(pythonic,setter,getter)
  • 不清楚你想要什么,但 Python 并没有真正“私有属性”。仅仅因为您可以添加任意属性,并不意味着这样做是个好主意。
  • 我想我对 setter、getter 赋予属性值的方式感到困惑,我试图找到一种设置值的好方法(但不确定 python 是如何做到这一点的),就像 \@在目标 C 中合成。现在很清楚了,在阅读了 abarnert @jonrsharpe 的帖子后,无论如何,谢谢。

标签: python class


【解决方案1】:

这里发生了两件事:

  1. 类属性
  2. 实例属性

区分差异很重要。

类属性如:

class A:
    a = 1

将随着创建的每个 Instance 持续存在。那就是:

a = A()
b = A()
a.a == b.a  # True

实例属性通常由称为__setattr__(以设置它们)和__getattr__(以检索 他们)。

类的所有实例(除非您使用__slots__)都有一个名为__dict__ 的内部字典。您不必为了在实例上设置属性而在类上“声明”属性。

阅读Python Data Model

【讨论】:

  • 谢谢,我知道类属性是其所有实例的通用属性,例如 string_a。并且 test_attr 仅对 test_instance 是唯一的。我不确定当我开始定义类时如何以良好的方式组织它们,有什么规则可以遵循吗?
  • 有很多意见和最佳实践。通常,您希望在您正在变异的数据和属性及其所需行为的某种表示之后对您的对象/类进行建模。
  • 以及如何跟踪这种独特(私有)属性?我经常在使用 python IDE 检查它们并阅读类文档时迷失方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2020-01-11
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
相关资源
最近更新 更多