gpt4 book ai didi

python - 理解 python 类属性

转载 作者:太空狗 更新时间:2023-10-30 00:50:49 26 4
gpt4 key购买 nike

我是编程新手,刚开始学习 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

我想了解使用 foo 和 bar 之间的区别是什么(关于我们定义它们的地方),因为在范围方面,它们在所有地方都可以平等地访问彼此,唯一的区别是一个在函数内部并且另一个在 Class 内部,但它们仍然是“实例”变量。那么哪个是好的做法?

此外,如果我稍微修改显示功能如下:

    def display(self,foo):
self.foo=foo
foo = foo
print "self.foo : ",self.foo
print "foo : ",foo

谁能解释一下 python 如何看待这一点,因为这个 self 关键字在两个 foo 之间带来了什么区别/意义。

最佳答案

bar 是类属性,foo 是实例属性。主要区别在于 bar 将可用于所有类实例,而 foo 仅当您在该实例上调用 display 时才可用于该实例

>>> ins1 = Test1()

ins1.bar 工作正常,因为它是一个类属性并且由所有实例共享。

>>> ins1.bar
10

但是你不能在这里直接访问 foo,因为它还没有定义:

>>> ins1.foo
Traceback (most recent call last):
File "<ipython-input-62-9495b4da308f>", line 1, in <module>
ins1.foo
AttributeError: Test1 instance has no attribute 'foo'

>>> ins1.display(12)
foo : 12
>>> ins1.foo
12

如果你想在创建实例时初始化一些实例属性,那么将它们放在 __init__ 方法中。

class A(object):
bar = 10
def __init__(self, foo):
self.foo = foo #this gets initialized when the instance is created
def func(self, x):
self.spam = x #this will be available only when you call func() on the instance
...
>>> a = A(10)
>>> a.bar
10
>>> a.foo
10
>>> a.spam
Traceback (most recent call last):
File "<ipython-input-85-3b4ed07da1b4>", line 1, in <module>
a.spam
AttributeError: 'A' object has no attribute 'spam'

>>> a.func(2)
>>> a.spam
2

关于python - 理解 python 类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17555151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com