一. Python 的类和实例
在面向对象中,最重要的概念就是类(class)和实例(instance),类是抽象的模板,而实例是根据类创建出来的一个个具体的 “对象”。
就好比,学生是个较为抽象的概念,同时拥有很多属性,可以用一个 Student 类来描述,类中可定义学生的分数、身高等属性,但是没有具体的数值。而实例是类创建的一个个具体的对象, 每一个对象都从类中继承有相同的方法,但是属性值可能不同,如创建一个实例叫 hansry 的学生,其分数为 93,身高为 176,则这个实例拥有具体的数值。
1.类:以Student类为例,在Python中,定义类如下:
class Student(object): def __init__(self,name,score): self.name=name self.score=score
a.(object)表示的是该类从哪个类继承下来的,而object类是每个类都会继承的一个类。 yt
b. __init__ 方法的第一参数永远是 self,用来表示类创建的实例本身,因此,在 __init__ 方法内部,就可以把各种属性绑定到self,因为self 本身就是指向创建的实例本身。
c. 有了 __init__ 方法后,在创建实例的时候,就不能传入空参数,必须传入与 __init__ 方法匹配的参数,但self本身不需要传入参数,只需要传入 self 后面的参数即可。
2.实例: 定义好了类后,就可以通过Student类创建出 Student 的实例,创建实例是通过 类名 + ()实现:
student = Student('name', 93) >>> student.name "name" >>> student.score 93
a. 其中 Student 是类名称,(’name’,93)为要传入的参数
b. self.name 就是 Student类的属性变量,为 Student 类所有。同时, name 是外部传来的参数,不是 Student 类所自带的。故 self.name = name 的意思就是把外部传来的参数 name 的值赋值给 Student类自己的属性变量 self.name .
3.和普通函数相比,在类中定义函本文来源gaodai$ma#com搞$$代**码网$数只有一点不同,就是第一参数永远是类的本身实例变量 self, 并且调用时,不用传递该参数。 除此之外,类的方法(函数)和普通函数没有啥区别。既可以用 默认参数、可变参数或者关键字参数等。
二. 类 以及 实例的访问
1.限制外部对类实例属性的访问
既然 Student 类实例本身就拥有这些属性的数据,那么要访问这些数据,就没必要从外面的函数去访问,而可以在类的内部定义访问数据的函数,这样,就可以把 ”数据“ 封装起来了。这些封装数据的函数和 Student 类本身是相关联的,称之为类的方法:
class Student(obiect): def __init__(self, name, score): self.name = name self.score = score def print_score(self): print "%s: %d" % (self.name, self.score)
>>> student= Student("hansry",99) >>> student.print_property() hansry:99
由此可见,从外部看Student类,我们只知道创建实例需要给出 name 和 score。究竟如何打印,是 Student 类内部定义的,这些数据和逻辑被封装起来了,调用也就变得容易了,但是不知道内部实现的细节。
如果不想让实例中的内部属性被外部属性访问,则把 name 和 score 变成 __name 和 __score 即可,如下代码所示:
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_property(self): print "%s: %d" %(self.__name,self.__score)
>>> student= Student("hansry",99) >>> student.print_property() >>> student.__name() hansry:99 Traceback (most recent call last): AttributeError: 'Student' object has no attribute '__name'