跟老齐学Python之编写类之一创建实例(2)
类和实例
•“类提供默认行为,是实例的工厂”,我觉得这句原话非常经典,一下道破了类和实例的关系。看上面代码,体会一下,是不是这个理?所谓工厂,就是可以用同一个模子做出很多具体的产品。类就是那个模子,实例就是具体的产品。所以,实例是程序处理的实际对象。
•类是由一些语句组成,但是实例,是通过调用类生成,每次调用一个类,就得到这个类的新的实例。
•对于类的:class Person,class是一个可执行的语句。如果执行,就得到了一个类对象,并且将这个类对象赋值给对象名(比如Person)。
也许上述比较还不足以让看官理解类和实例,没关系,继续学习,在前进中排除疑惑。
self的作用
细心的看官可能注意到了,在构造函数中,第一个参数是self,但是在实例化的时候,似乎没有这个参数什么事儿,那么self是干什么的呢?
self是一个很神奇的参数。
在Person实例化的过程中,数据"qiwsir","python","qiwsir.github.io"通过构造函数(__init__())的参数已经存入到内存中,并且这些数据以Person类型的面貌存在组成一个对象,这个对象和变量info建立的引用关系。这个过程也可说成这些数据附加到一个实例上。这样就能够以:object.attribute的形式,在程序中任何地方调用某个数据,例如上面的程序中以info.name得到"qiwsir"这个数据。这种调用方式,在类和实例中经常使用,点号“.”后面的称之为类或者实例的属性。
这是在程序中,并且是在类的外面。如果在类的里面,想在某个地方使用传入的数据,怎么办?
随着学习的深入,看官会发现,在类内部,我们会写很多不同功能的函数,这些函数在类里面有另外一个名称,曰:方法。那么,通过类的构造函数中的参数传入的这些数据也想在各个方法中被使用,就需要在类中长久保存并能随时调用这些数据。为了解决这个问题,在类中,所有传入的数据都赋给一个变量,通常这个变量的名字是self。注意,这是习惯,而且是共识,所以,看官不要另外取别的名字了。
在构造函数中的第一个参数self,就是起到了这个作用——接收实例化过程中传入的所有数据,这些数据是通过构造函数后面的参数导入的。显然,self应该就是一个实例(准确说法是应用实例),因为它所对应的就是具体数据。
如果将上面的类增加两句,看看效果:
#!/usr/bin/env python
#coding:utf-8
class Person:
def __init__(self, name, lang, website):
self.name = name
self.lang = lang
self.website = website
print self #打印,看看什么结果
print type(self)
#运行结果
<__main__.Person instance at 0xb74a45cc>
<type 'instance'>
证实了推理。self就是一个实例(准确说是实例的引用变量)。
self这个实例跟前面说的那个info所引用的实例对象一样,也有属性。那么,接下来就规定其属性和属性对应的数据。上面代码中:self.name = name,就是规定了self实例的一个属性,这个属性的名字也叫做name,这个属性的数据等于构造函数的参数name所导入的数据。注意,self.name中的name和构造函数的参数name没有任何关系,它们两个一样,只不过是一种起巧合(经常巧合),或者说是写代码的人懒惰,不想另外取名字而已,无他。当然,如果写成self.xxxooo = name,也是可以的。
其实,从效果的角度来理解,可能更简单一些,那就是类的实例info对应着self,info通过self导入实例属性的所有数据。
当然,self的属性数据,也不一定非得是由参数传入的,也可以在构造函数中自己设定。比如:
#!/usr/bin/env python
#coding:utf-8