K D*_*awG -2 python constructor python-2.7
__str__如果self.foo未定义,第一个示例中的方法如何成功返回字符串:
class foo:
foo = 'K-Dawg'
def __str__(self):
return self.foo
obj = foo()
print obj
#K-Dawg
Run Code Online (Sandbox Code Playgroud)
当我创建一个类构造函数方法时__init__,它会产生:
AttributeError:foo实例没有属性'foo'
class foo:
def __init__(self):
foo = 'K-Dawg'
def __str__(self):
return self.foo
obj = foo()
print obj
Run Code Online (Sandbox Code Playgroud)
为什么self.foo在第一个例子中成功返回,而不是在第二个例子中?
类构造函数对其属性有什么影响?
编辑:我知道foo = 'K-Dawg'改为成功self.foo = 'K-Dawg'打印K-Dawg,但我问的是为什么foo第一个例子中的属性被调用self.foo
修改第一个程序
class foo:
foo = 'K-Dawg'
def __str__(self):
print dir(self)
return self.foo
obj = foo()
print obj
Run Code Online (Sandbox Code Playgroud)
修改第二个程序
class foo:
def __init__(self):
print locals()
foo = 'K-Dawg'
print locals()
def __str__(self):
print locals()
return self.foo
obj = foo()
print obj
Run Code Online (Sandbox Code Playgroud)
我刚刚包含了一些印刷语句.如果你查看每个程序的输出,你将能够弄清楚到底发生了什么.
第一个程序将打印出来
['__doc__', '__module__', '__str__', 'foo']
K-Dawg
Run Code Online (Sandbox Code Playgroud)
我们可以看到foo对象已经存在了.实际上,在这种情况下,foo是一个类变量(与类实例无关.如果你来自C,C++或JAVA背景,这可以被视为一个静态变量,它绑定到一个类而不是一个Object.)
第二个程序将打印出来
{'self': <__main__.foo instance at 0x7f528aa90488>}
{'self': <__main__.foo instance at 0x7f528aa90488>, 'foo': 'K-Dawg'}
{'self': <__main__.foo instance at 0x7f11f236d488>}
AttributeError: foo instance has no attribute 'foo'
Run Code Online (Sandbox Code Playgroud)
它显然告诉我们变量foo是在__init__函数中创建的,但它到达时它是不可用的__str__.这意味着foo创建的变量__init__是该函数的本地变量.
如果你想在对象中创建变量,你应该这样做
class foo:
def __init__(self):
print locals()
self.foo = 'K-Dawg' # Note the self keyword at the beginning
print locals()
def __str__(self):
print locals()
return self.foo
obj = foo()
print obj
Run Code Online (Sandbox Code Playgroud)
产量
{'self': <__main__.foo instance at 0x7fe0e2da24d0>}
{'self': <__main__.foo instance at 0x7fe0e2da24d0>}
{'self': <__main__.foo instance at 0x7fe0e2da24d0>}
K-Dawg
Run Code Online (Sandbox Code Playgroud)
self指向类的当前实例,并且我们附加了一个foo通过执行调用的变量self.foo = 'K-Dawg'.这就是为什么这样的原因.
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |