Python 实例;上课__

Python 实例;上课__,python,attributes,Python,Attributes,首先是代码: class A(object): def foo(self): self.foo = 'foo' def bar(self): self.bar = 'bar' cls_dict = dict(A.__dict__) #not empty a = A() a_dict = dict(a.__dict__) #empty, why? a.。\uuuu dict\uuuuuu为空,因为没有定义\uuuu init\uuuuuu(

首先是代码:

class A(object):
    def foo(self):
        self.foo = 'foo'
    def bar(self):
        self.bar = 'bar'

cls_dict = dict(A.__dict__)  #not empty

a = A()
a_dict = dict(a.__dict__)  #empty, why?

a.。\uuuu dict\uuuuuu
为空,因为没有定义
\uuuu init\uuuuuu()
,因此实例上没有初始化任何属性。同时,类是一个对象,它初始化了一些属性

>>> A
<class '__main__.A'>
>>A

在Python中,所有内容都是包含属性的对象。这包括类本身。整个面向对象的东西,包括定义方法的类和可以使用每个实例的不同数据执行这些方法的实例,只是一个查找一系列对象中属性的协议

class A(object):
    def foo(self):
        self.foo = 'foo'
    def bar(self):
        self.bar = 'bar'
这将创建一个类对象,绑定到名称
a
。该对象包含两个属性,
foo
bar
,每个属性都绑定到方法对象

a = A()
这将创建一个绑定到名称
a
的对象,该名称是
a
的实例。它还没有包含任何属性。但是它是
A
的一个实例这一事实意味着,当您请求
A.foo
时,“查找协议”是首先在
A
上查找属性,如果失败,则在
A
上查找属性。这就是
A
的所有实例访问同一组方法的方式


在Python中,您还可以随时(几乎)在任何对象上创建属性。它只需要
some\u object.some\u attribute=some\u value
。在执行此操作之前,该属性不存在。因此,通过实际调用
a.foo()
a.bar()
,那些
foo
bar
属性在
a
中不存在(你的程序在某一天可能会或可能不会向该对象添加任何其他属性),这就是
a.\uu dict\uu
在你调用它的地方是空的原因。如果您希望每个对象上都存在
foo
bar
的“默认”值,则需要通过在
\uuuu init\uuuuu
方法中设置这些值来说明这一点。

对此进行了很好的解释:
\uuuu dict\uuuu
仅直接包含对象上的属性。首先,您希望在其中包含什么?@li.davidm,
直接在对象上
?类中定义的属性不算在内?@Alcott:不算,因为它们是“分开的”(在某种意义上)。类和实例都是对象,实例可以替换对象上定义的属性,因此它们是分开的。我链接到的页面更加清晰。