这两个类有什么区别?
class A():
x=3
class B():
def __init__(self):
self.x=3
有任何显著的区别吗?
这两个类有什么区别?
class A():
x=3
class B():
def __init__(self):
self.x=3
有任何显著的区别吗?
A.x
是一个类变量。 B
的 self.x
是一个实例变量。
也就是说,A
的 x
在实例之间是共享的。
通过可以修改的列表更容易演示它们之间的区别:
#!/usr/bin/env python
class A:
x = []
def add(self):
self.x.append(1)
class B:
def __init__(self):
self.x = []
def add(self):
self.x.append(1)
x = A()
y = A()
x.add()
y.add()
print("A's x:", x.x)
x = B()
y = B()
x.add()
y.add()
print("B's x:", x.x)
输出
A's x: [1, 1]
B's x: [1]
只是一件小事情: self
实际上只是一个随意选择的单词,每个人都使用它,但你也可以使用 this
、foo
、myself
或者任何你想要的其他单词,它只是类的每个非静态方法的第一个参数。这意味着 self
这个词不是语言构造而只是一个名称:
>>> class A:
... def __init__(s):
... s.bla = 2
...
>>>
>>> a = A()
>>> a.bla
2
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
我曾经用这个例子来解释它
# 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
我刚开始学习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
的意思是“我正在从 obj
中获取 color="red"
”。self
来指定应该从哪个对象获取颜色,因此它获取全局变量 color = 'blue'
。obj2
而不是 self
,它是另一个对象的名称,用来获取 color
。它得到了 color = 'green'
。