Python类属性

Python类属性,python,Python,来自Yaniv Aknin的帖子关于。有这样一种说法 获取类型的属性直接连接到类型结构指向的类型实例的私有字典的字典分配 我正在努力理解它的含义 在帖子中,它使用了类型这个术语,而不是类。因此,我将其理解为一个类也有一个类型,它是类型,并且类型有使用类的dict来检索和设置属性的插槽。但为什么获取属性要与字典赋值相关联呢?这不应该是设置操作吗?如果您还没有使用示例,这可能会有所帮助。python中的对象有一个特殊属性dict,即“支持任意函数属性的名称空间” 请注意,Person对象有dict

来自Yaniv Aknin的帖子关于。有这样一种说法

获取类型的属性直接连接到类型结构指向的类型实例的私有字典的字典分配

我正在努力理解它的含义


在帖子中,它使用了
类型
这个术语,而不是
。因此,我将其理解为一个
也有一个类型,它是
类型
,并且
类型
有使用类的dict来检索和设置属性的插槽。但为什么获取属性要与字典赋值相关联呢?这不应该是设置操作吗?

如果您还没有使用示例,这可能会有所帮助。python中的对象有一个特殊属性dict,即“支持任意函数属性的名称空间”


请注意,Person对象有dictionarydict,其中包含属性的键值对。

老实说,这是一个措辞非常笨拙的句子。我想它所要表达的意思是,获取/设置类属性与修改类型dict是一样的。我猜作者所说的是
inst.\uuuu dict\uuuuu
本身,它是
\uu dict\uuuu
分配给
inst
;换句话说,
inst.\uuuu dict\uuuu
在这里被称为“字典赋值”。一个不那么尴尬的措辞可能是“获取类型的属性就是从分配给实例的私有字典中检索值”。类是一个对象,就像python中的其他所有对象/变量/函数一样,它有一个
\uuu dict\uuuu
属性,可以描述为“类型实例的私有字典”,这是存储类属性的位置。类通常从内置的
type
派生/子类,这就是为什么它们可以被描述为“类型”,假设
C
是一个类型(例如,一个类),我认为“获取属性”意味着引用属性,因为
C.a
C.a.\u dict\uu[“a”
是一样的。令人困惑的是,这句话说的是“字典作业”,这是得到某物的反面。您可以分配
C.B='foo'
,但不能分配
C.B.\uu dict\uuu['B']='foo'
,因为这不是标准的
dict
。它是一个
dict\u proxy
,它的
\uuuuu setitem\uuuuuuuuu
(实际上是C等价物)阻止了操作。类变量可以由实例
self读取。A
dict_proxy
只会使这类事情更有效。@IainShelvington-这个问题非常集中,我不明白为什么会关闭它。获取类型的属性与字典分配无关。它们是相反的东西。OP的混淆是有道理的。除了问题是关于类型对象(
Person
,在您的示例中)及其与实例的区别<代码>个人。u dict_u_____________________。和person.\uu dict\uuu[“somevar”]也与'person.somevar'不同。第一个变量不会返回到类级变量。Python在下面将其转换为Person。例如,构造函数的_uinit ___;(Person)。实例是这里的参数,而init属于该类型。如果我能插入我以前的一位老师的话,你可以在这里检查一下,或者在文本中搜索面向对象编程的基本方程()。yes Person是一个类,因此它的dict包含支持python类行为的属性,如init、dict和module。希望这有帮助。你的答案是正确的。。。这与问题无关。该链接引用了关于python类型(例如,
Person
)如何在C级工作的讨论。一个类型对象,即使它是一个实例对象,它的工作方式也不同于像
person
这样的常规实例。事实上,C级扩展可以做很多疯狂的事情。好吧,我明白了,这比我想象的要复杂得多,很抱歉,我没有正确理解它。如果你愿意,我可以把答案留在这里。希望其他人能更好地回答。
class Person:
    def __init__(self):
        # self here is person
        # set its attributes age and name
        self.age = 21
        self.name = "Bob"

# person object is of type Person
person = Person()

print( person.__dict__ )
# {'age': 21, 'name': 'Bob'}

# Add a new variable to person object namespace
person.new_var = "a_new_value"

print( person.__dict__ )
# {'age': 21, 'name': 'Bob', 'new_var': 'a_new_value'}