这两个班级有何不同?
class A():
x=3
class B():
def __init__(self):
self.x=3
有什么显着差异吗?
答案 0 :(得分:133)
A.x
是类变量。
B
的{{1}}是实例变量。
即。 self.x
的{{1}}在实例之间共享。
可以更容易地证明与可以像列表一样修改的内容的区别:
A
输出
A的x:[1,1] B的x:[1]
答案 1 :(得分:53)
正如旁注:self
实际上只是一个随机选择的单词,每个人都使用,但您也可以使用this
,foo
或myself
或你想要的任何东西,它只是一个类的每个非静态方法的第一个参数。这意味着单词self
不是语言结构,而只是名称:
>>> class A:
... def __init__(s):
... s.bla = 2
...
>>>
>>> a = A()
>>> a.bla
2
答案 2 :(得分:22)
A.x是一个类变量,除了在实例中特别重写之外,它将在A的所有实例之间共享。 B.x是一个实例变量,B的每个实例都有自己的版本。
我希望以下Python示例能够澄清:
>>> class Foo():
... i = 3
... def bar(self):
... print 'Foo.i is', Foo.i
... print 'self.i is', self.i
...
>>> f = Foo() # Create an instance of the Foo class
>>> f.bar()
Foo.i is 3
self.i is 3
>>> Foo.i = 5 # Change the global value of Foo.i over all instances
>>> f.bar()
Foo.i is 5
self.i is 5
>>> f.i = 3 # Override this instance's definition of i
>>> f.bar()
Foo.i is 5
self.i is 3
答案 3 :(得分:16)
我曾经用这个例子解释它
# By TMOTTM
class Machine:
# Class Variable counts how many machines have been created.
# The value is the same for all objects of this class.
counter = 0
def __init__(self):
# Notice: no 'self'.
Machine.counter += 1
# Instance variable.
# Different for every object of the class.
self.id = Machine.counter
if __name__ == '__main__':
machine1 = Machine()
machine2 = Machine()
machine3 = Machine()
#The value is different for all objects.
print 'machine1.id', machine1.id
print 'machine2.id', machine2.id
print 'machine3.id', machine3.id
#The value is the same for all objects.
print 'machine1.counter', machine1.counter
print 'machine2.counter', machine2.counter
print 'machine3.counter', machine3.counter
然后输出
machine1.id 1 machine2.id 2 machine3.id 3 machine1.counter 3 machine2.counter 3 machine3.counter 3
答案 4 :(得分:3)
我刚刚开始学习Python,这让我很困惑了一段时间。试图弄清楚这一切是如何运作的,我想出了这个非常简单的代码:
# Create a class with a variable inside and an instance of that class
class One:
color = 'green'
obj2 = One()
# Here we create a global variable(outside a class suite).
color = 'blue'
# Create a second class and a local variable inside this class.
class Two:
color = "red"
# Define 3 methods. The only difference between them is the "color" part.
def out(self):
print(self.color + '!')
def out2(self):
print(color + '!')
def out3(self):
print(obj2.color + '!')
# Create an object of the class One
obj = Two()
当我们致电out()
时,我们得到:
>>> obj.out()
red!
当我们致电out2()
时:
>>> obj.out2()
blue!
当我们致电out3()
时:
>>> obj.out3()
green!
因此,在第一个方法self
中指定Python应该使用变量(属性),那个"属于"到我们创建的类对象,而不是全局类(在类外)。所以它使用color = "red"
。在方法中,Python隐式地将self
替换为我们创建的对象的名称(obj
)。 self.color
表示"我从color="red"
"
obj
在第二种方法中,没有self
来指定应从中获取颜色的对象,因此它获得全局的color = 'blue'
。
在第三种方法而不是self
中,我们使用了obj2
- 另一个从color
获取的对象的名称。得到color = 'green'
。