代码优先:
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)
在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(),那些foo和bar属性不存在a(您的程序有一天可能或可能不会添加到该对象的任何其他属性),这就是为什么a.__dict__在您调用它时为空的原因.如果您期望在每个对象上存在foo和bar存在"默认"值,则需要通过在__init__方法中设置这些值来说明.
a.__dict__为空,因为实例上没有任何属性被初始化,因为没有__init__()定义。同时,类也是一个对象,它初始化了一些属性。
>>> A
<class '__main__.A'>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2485 次 |
| 最近记录: |