理解python类属性

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.

pha*_*t0m 3

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将是test1foo80test1.foo因此将被设置为80

    foo = foo
Run Code Online (Sandbox Code Playgroud)

这根本没有任何作用。它引用第一个参数foo

接下来的两行再次引用实例变量foo和第一个参数foo