第一个示例中的__str__
方法如何在尚未定义self.foo
的情况下成功返回字符串:
class foo:
foo = 'K-Dawg'
def __str__(self):
return self.foo
obj = foo()
print obj
#K-Dawg
当我创建一个类构造函数方法__init__
时,会产生:
AttributeError: foo instance has no attribute 'foo'
class foo:
def __init__(self):
foo = 'K-Dawg'
def __str__(self):
return self.foo
obj = foo()
print obj
为什么self.foo
在第一个示例中成功返回,而在第二个示例中没有成功返回?
类构造函数对其属性有什么影响?你知道吗
编辑:
我知道将foo = 'K-Dawg'
更改为self.foo = 'K-Dawg'
将成功打印K-Dawg,但我想问的是,为什么第一个示例中的属性foo
可以使用self.foo
调用
修改了第一个程序
修改了第二个程序
我只写了一些书面声明。如果你看一下每一个程序的输出,你就能知道到底发生了什么。你知道吗
将打印第一个程序
我们可以看到
foo
已经存在于对象中。实际上,在本例中,foo
是一个类变量(与类实例无关)。如果你是C、C++或java背景,这可以被看作是一个静态变量,它绑定到一个类而不是对象。)第二个程序将打印
很明显,它向我们展示了变量
foo
是在__init__
函数中创建的,但当它到达__str__
时就不可用了。这意味着在__init__
中创建的foo
变量是该函数的局部变量。你知道吗如果要在对象中创建变量,应该执行以下操作
输出
self
指向类的当前实例,我们通过执行self.foo = 'K-Dawg'
来附加一个名为foo
的变量。这就是为什么这是有效的。你知道吗在第一个示例中,您已经创建了一个类属性
foo
——一个在类的所有实例中共享的属性。当您尝试访问self.foo
时,如果实例没有自己的foo
属性,它将从类中读取该属性。你知道吗在第二种情况下,您根本没有创建属性。^}只是一个局部变量。如果要创建实例变量,需要:
__init__
中的{相关问题 更多 >
编程相关推荐