实例.__ dict__&类.__ dict__

时间:2011-10-11 01:52:15

标签: 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?

2 个答案:

答案 0 :(得分:8)

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

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

这将创建一个绑定到名称A的类对象。该对象包含两个属性foobar,每个属性都绑定到方法对象。

a = A()

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

在Python中,您也可以随时在(几乎)任何对象上创建属性。所需要的只是some_object.some_attribute = some_value。在您这样做之前,该属性不存在。因此,实际调用a.foo()a.bar()时,foo中不存在bara属性(您的程序可能会或可能不会执行任何其他属性)有一天添加到该对象),这就是为什么a.__dict__在您调用它时为空的原因。如果您希望foobar的“默认”值存在于每个对象上,则需要通过在__init__方法中设置这些值来说明。

答案 1 :(得分:0)

a.__dict__为空,因为没有在实例上初始化任何属性,因为没有定义__init__()。同时,一个类是一个对象,它已经初始化了一些属性。

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