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:不算,因为它们是“分开的”(在某种意义上)。类和实例都是对象,实例可以替换对象上定义的属性,因此它们是分开的。我链接到的页面更加清晰。