实例.__ dict__&class .__ dict__

Alc*_*ott 4 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?
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 8

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

class A(object):
    def foo(self):
        self.foo = 'foo'
    def bar(self):
        self.bar = 'bar'
Run Code Online (Sandbox Code Playgroud)

这将创建一个绑定到名称的类对象A.该对象包含两个属性,foo并且bar每个属性都绑定到方法对象.

a = A()
Run Code Online (Sandbox Code Playgroud)

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

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


Aus*_*all 0

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

>>> A
<class '__main__.A'>
Run Code Online (Sandbox Code Playgroud)