代码优先:
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?
答案 0 :(得分:8)
在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_object.some_attribute = some_value
。在您这样做之前,该属性不存在。因此,实际调用a.foo()
或a.bar()
时,foo
中不存在bar
和a
属性(您的程序可能会或可能不会执行任何其他属性)有一天添加到该对象),这就是为什么a.__dict__
在您调用它时为空的原因。如果您希望foo
和bar
的“默认”值存在于每个对象上,则需要通过在__init__
方法中设置这些值来说明。
答案 1 :(得分:0)
a.__dict__
为空,因为没有在实例上初始化任何属性,因为没有定义__init__()
。同时,一个类是一个对象,它已经初始化了一些属性。
>>> A
<class '__main__.A'>