类和实例

面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

仍以Student类为例,在Python中,定义类是通过class关键字:

class Student(object):
pass

class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。

定义好了Student类,就可以根据Student类创建出Student的实例,创建实例是通过类名+()实现的:

>>> bart = Student()
>>> bart
<__main__.Student object at 0x10a67a590>
>>> Student
<class '__main__.Student'>

可以看到,变量bart指向的就是一个Student的实例,后面的0x10a67a590是内存地址,每个object的地址都不一样,而Student本身则是一个类。

可以自由地给一个实例变量绑定属性,比如,给实例bart绑定一个name属性:

>>> bart.name = 'Bart Simpson'
>>> bart.name
'Bart Simpson'

由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把namescore等属性绑上去:

class Student(object):

    def __init__(self, name, score):
self.name = name
self.score = score
注意:特殊方法“__init__”前后分别有两个下划线!!!

注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。

有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:

>>> bart = Student('Bart Simpson', 59)
>>> bart.name
'Bart Simpson'
>>> bart.score
59

和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。

数据封装

面向对象编程的一个重要特点就是数据封装。在上面的Student类中,每个实例就拥有各自的namescore这些数据。我们可以通过函数来访问这些数据,比如打印一个学生的成绩:

>>> def print_score(std):
... print('%s: %s' % (std.name, std.score))
...
>>> print_score(bart)
Bart Simpson: 59

但是,既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法:

class Student(object):

    def __init__(self, name, score):
self.name = name
self.score = score def print_score(self):
print('%s: %s' % (self.name, self.score))

要定义一个方法,除了第一个参数是self外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入:

>>> bart.print_score()
Bart Simpson: 59

最新文章

  1. After the exam
  2. xpath 总结
  3. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
  4. C++基础知识
  5. MySQL的create table as 与 like区别
  6. Asp.Net异步编程-使用了异步,性能就提升了吗?
  7. java环境log4j日志环境的配置。
  8. sky A800s手机恢复出厂设置操作
  9. HDOJ 2167 Pebbles (状态压缩dp)
  10. jQuery deferred学习笔记
  11. Windows下编译eXosip、osip,以及UAC和UAS的例子
  12. [文学阅读] METEOR: An Automatic Metric for MT Evaluation with Improved Correlation with Human Judgments
  13. Android Studio的使用(五)--导入第三方Jar包
  14. 路过Haxe
  15. linux cpu load学习笔记
  16. keydown,keypress,keyup三者之间的区别
  17. Perl socket编程
  18. div水平垂直居中方法及优缺点
  19. Postgresql 数据库,如何进行数据备份以及导入到另外的数据库
  20. php常用函数——字符串函数

热门文章

  1. 一个神秘URL酿大祸,差点让我背锅!
  2. Java实现 蓝桥杯 算法训练 最大的算式
  3. Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
  4. java实现排他平方数
  5. Java实现第九届蓝桥杯字母阵列
  6. Python之Flask框架二
  7. android日常开发总结的技术经验60条
  8. css实现朋友圈照片排列布局
  9. html中隐藏域hidden
  10. jreble备注