ram*_*amd 5 python python-2.7 python-3.x
我是编程新手并开始学习python.可能看起来很愚蠢的问题,所以请原谅我的无知.请考虑以下代码段:
class Test1:
bar = 10
def display(self,foo):
self.foo=foo
print "foo : ",self.foo #80
def display1(self):
print "bar: ", self.bar #10
print "again foo: ", self.foo #80
if __name__ == '__main__':
test1 = Test1()
test1.display(80)
test1.display1()
print test1.bar #10
print test1.foo #80
Run Code Online (Sandbox Code Playgroud)
我想了解使用foo和bar(wrt到我们定义它们的地方)之间的区别,因为在范围方面它们在所有地方都可以相互比较,并且唯一的区别是一个在内部功能而另一个在内部类但它们都仍然是"实例"变量.那么哪种做法很好?
另外,如果我稍微修改显示功能如下:
def display(self,foo):
self.foo=foo
foo = foo
print "self.foo : ",self.foo
print "foo : ",foo
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下python是如何看待这个的,因为这个self
关键字在两者之间带来了什么区别/意义foo
.
bar
是一个类属性。由于 Python 中的类是对象,因此它们也可以具有属性。bar
只是碰巧存在于该Test
对象上,而不是其实例上。
由于 Python 解析属性查找的方式,它看起来像是test1
有一个bar
属性,但实际上没有。
foo
另一方面,test1
在调用后存在于实例上display(80)
。这意味着 的不同实例Test
在其各自的foo
属性中可以具有不同的值。
当然,您可以使用类变量作为某种“共享默认值”,然后您可以使用实例属性“覆盖”它,但这可能会令人困惑。
第二个问题
def display(self,foo):
self.foo=foo
foo = foo
print "self.foo : ",self.foo
print "foo : ",foo
Run Code Online (Sandbox Code Playgroud)
让我们先了解一下细节:self
不是关键字,只是将第一个参数称为“self”的惯例,如果您愿意,您也可以将其称为“this”或“that”或“bar”,但我不会不建议这样做。
Python 将传递对象,并在该对象上调用方法作为第一个参数。
def display(self,foo):
Run Code Online (Sandbox Code Playgroud)
这个 foo 是显示实例函数的第一个参数的名称。
self.foo=foo
Run Code Online (Sandbox Code Playgroud)
这将使用实例的名称“foo”设置属性,您在该实例上调用了display()
作为第一个参数传递的值。使用您的示例test1.display(80)
,self
将是test1
,foo
是80
,test1.foo
因此将被设置为80
。
foo = foo
Run Code Online (Sandbox Code Playgroud)
这根本没有任何作用。它引用第一个参数foo
。
接下来的两行再次引用实例变量foo
和第一个参数foo
。