这两个班级有何不同?
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的x:[1,1]
B的x:[1]
正如一个侧面说明:self
实际上只是一个随机选择的话,每个人都使用,但你也可以使用this
,foo
或myself
或者任何你想要的东西,它只是一类每一个非静态方法的第一个参数.这意味着该单词self
不是语言结构,而只是一个名称:
>>> class A: ... def __init__(s): ... s.bla = 2 ... >>> >>> a = A() >>> a.bla 2
Ax是一个类变量,除了在实例中特别重写之外,它将在A的所有实例之间共享.Bx是一个实例变量,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