Python – 为什么在一个类中使用“self”?
这两个class级有什么不同?
class A(): x=3 class B(): def __init__(self): self.x=3
有什么重大的区别?
Ax
是一个类variables 。 B
的self.x
是一个实例variables 。
即A
的x
在实例之间共享。
用一个可以像列表一样修改的东西来certificate它们的区别会更容易一些:
#!/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:",xx x = B() y = B() x.add() y.add() print "B's x:",xx
产量
A的x:[1,1]
B的x:[1]
正如一个侧面提示: self
实际上只是一个随机select的单词,每个人都使用,但是你也可以使用this
, foo
,或者myself
或者其他任何你想要的,这只是每个类的非静态方法的第一个参数。 这意味着self
这个词不是一个语言结构,而只是一个名字:
>>> class A: ... def __init__(s): ... s.bla = 2 ... >>> >>> a = A() >>> a.bla 2
Ax是一个类variables,并将在A的所有实例之间共享,除非在实例中被特别覆盖。 Bx是一个实例variables,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 >>> fi = 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!
当我们呼叫2 out2()
:
>>> obj.out2() blue!
当我们呼叫out3()
:
>>> obj.out3() green!
因此,在第一种方法中, self
指定Python应该使用variables(属性),该variables属于我们创build的类对象,而不是全局variables(在类之外)。 所以它使用color = "red"
。 在Python的方法中隐式地用self
replace我们创build的对象的名字( obj
)。 self.color
意思是“我正在从obj
获取color="red"
“
在第二种方法中,没有self
指定应该从哪个对象获取颜色,所以它得到全局的一个color = 'blue'
。
在第三种方法中,我们使用了obj2
– 另一个对象的名称来获取color
。 它获取color = 'green'
。