在学习Python的面向对象过程中,我对self并不理解,今天在翻阅《Python学习手册(第三版)》以及结合学习PyQt4(因为其中有大量的类)的过程中,对类属性,实例属性以及self的作用有了一个基本的理解。
>>> class Test():
... name = 'LinuxerRocky'
... def __init__(self,value):
... self.data = value
... def display(self):
... print self.data
...
上面的code是在解释器中写的,在这里,我定义了一个名字叫做Test的类。在这个类的代码中,name为类属性,下面两个函数也为类属性。什么是类属性?可以观察到,我们在class代码区域中,对于赋值的变量名,比如name,这些就是类的属性(类属性通常是在class代码区中的顶层赋值语句产生的);当然,我们也可以在class代码区意外创建类属性。其中
再看self.data = value,这里的data属性属于实例属性。那么我们如何创建实例属性呢?实例属性是通过实例对象赋值属性来创建的,正如《Python学习手册(第三版)》所描述:实例属性一般是在class语句中的类方法对self参数赋值属性来创建的。不过,你也可以在任何地方引用实例通过赋值语句来创建属性,即使是在class语句之外。一般来说,实例属性都是在__init__构造器中初始化。
下面我们对上面的Test类进行实例:
>>> c1 = Test('LinuxerRocky') #创建一个Test类的实例c1
>>> c1.data #实例对象c1访问它的data属性
'LinuxerRocky'
>>> c1.display()
LinuxerRocky
>>> c1.age = 21 #为实例c1增加一个实例属性,命名为age,赋值为21
>>>
>>> c2 = Test('Bob') #创建实例c2
# >>> c2.data
'Bob'
>>> c2.age
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Test instance has no attribute 'age'
上面语句基本都有注解,那么我们看c2.age以及下面的报错信息:我们有c1.age=21这条语句,然后使用c2实例访问age这个属性,但是发生了报错信息,提示为实例没有age这个属性。为什么呢?因为age这个属性只属于c1,而不属于c2。所以我们上面就有这样一句话:你也可以在任何地方引用实例通过赋值语句来创建属性,即使是在class语句之外。但是我们发现,可以用c1和c2访问name属性而不会报错,这是因为name属性是一个类属性,类属性对于所有实例来说,他都是共享的!
self的意义:在类中的方法里面,我们将self作为第一个参数,然后python会自动填入实例对象-----即调用方法的实例或者主体。其实,重要的不是self,而是self所在的位置,self可以被a,b,c等任何字符代替! 通过上面的例子我们可以发现,self简单的来说,他就是代表一个实例(不知道这样理解对不对)
最后,再看__init__这个特殊的方法,他是一个构造器。这个构造器的特殊之处就在于我们在对类进行实例化时,这个函数就会被执行,会创建设定的属性或实现其他的功能,这样做的好处就是进行数据的初始化。
方法函数的特殊参数self和__init__构造器是python中面向对象的基石
补充:self与self.
self. data 可以给实例对象属性赋值或者是用来访问某实例属性
self 代表实例对象本身;
注意:此文是我在初学时的小总结,可能会有不恰当的地方,因此此文会随着自身知识的完善而不断更新