文章目录
- 一、概述
- 1. 万物皆对象
- 2. 对象的优越性
- 3. 类和对象
- 二、定义和使用类
- 1. 定义类(class)
- 2. 使用类
一、概述
1. 万物皆对象
早期的编程语言是面向过程的,数据和函数之间是没有任何直接联系的,它们之间联系的方式就是通过函数调用提供参数的形式将数据传入函数进行处理,但这可能因为错误的传递参数、错误地修改了数据而导致程序出错,当需要修改或维护程序时要从程序提供的一堆数据中去寻找和修改它们。要扩展函数的功能,只能重新建立一个函数或修改它,所以其开发效率有点低。
而从现实世界得到的启发就是任何事物都具有自己的属性或能力,比如一张桌子有高度材质、颜色、重量等属性;但它无生命,自己不能移动,也不具有完成其他动作的能力。再如一只小狗,也有毛色、重量、年龄、体重等属性;它有生命,可以自己走路、奔跑、叫唤等,具有自己的能力.
那么,在程序中模仿现实世界,对现实世界中的事物进行有目的抽象,即抽象出现实世界事物中对用户有用的属性和能力来建立一个关联在一起的模型,对于现实世界中事物没有的属性或能力,而程序中需要的,则可以在程序中进行添加;对于现实世界中事物具有的属性或能力,而程序中不需要关心的,则可以在程序中不进行表达。这种抽象出来的模型被称之为对象或类。
面向对象编程就是通过面向对象分析和设计,建立模型(类或对象)并完成最终程序的过程。因此,在面向对象编程中,编程的主体就是用类或对象构建模型,并使它们之间可以互相联系以解决实际问题。
2. 对象的优越性
主要体现在以下几个方面:
- 封装:
指将对象的属性和能力包装在一起,需要对外展示时,其他对象才能得到或使用它,而不需要对外展示的细节则隐藏在对象的内部。比如一台电视机,它展示在外部的就是一些开关和控制按钮,里面的电路结构就是隐藏的细节。 - 继承:
指通过获取父对象的属性及能力,再加上自定义的属性和能力而成为一个对象的子对象或一个类的子类。 - 包含:
指在对象建模的时候,还可以对对象模型进行细分。即将一个对象划分为几部分,分别进行建模,最后将它们组装在一起成为一个完整的对象。
3. 类和对象
具有相同属性或能力的模型在面向对象编程中以类进行定义和表示的。
由类可以派生出(实例化)出同类的各个实例。
就像一枚印章一样,沾上不同颜色的墨水就可以印出不同颜色的文字或图形,刻制一枚印章可以理解为定义一个类,印章的每一次使用都可以理解为类的一次实例化。
在Python语言中,前面所讲的数据类型其实也都是面向对象的。
例如对于整数类型(int),每一个整数都是整数类的实例;对于浮点数类型,每一个实际的浮点数都是浮点数类的一个实例。
注意:“对象”一词在面向对象编程中,根据上下文不同可以指“类”,也可以指“实例”,这并不是一个很准确的称呼。
二、定义和使用类
上面说了这么多,主要是想让一些对类和对象没有任何概念的同学产生一点模糊的认识,接下来就说说如何定义和使用类。
1. 定义类(class)
在python语言中定义类的基本形式为:
class <类名>(父类名):
pass
其中:
-
class
:表示定义一个类的关键字 -
类名
:符合标识符规范的名称(就像变量名一样就行了) -
父类名
:该类所继承的类的名称(可以没有,表示该类不继承自别的类,这时可以连括号也不写) -
pass
:表示这里暂时用空语句(什么都不做)占位,等待之后再完成。
注意,冒号 :
不能省略
如下定义一个最简单的类:
class Test:
pass
看似这个类什么也没做,也没有继承其他的类,但在python中,没有继承其他类的类,会自动继承系统内建的类 object
,使用 dir(Test)
可以查看 Test
类从object类所继承到的属性和方法。
>>>dir(Test)
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__']
2. 使用类
类在定义后必须先实例化才能使用,类的实例化与函数调用类似,使用类名加圆括号的形式 类名()
就可以了。
如下:
class MyClass: #定义一个类
"This is my first class" #该类只有一些说明信息,没有具体语句
a = MyClass() #实例化一个类,实例名为a
print(a.__doc__) #输出实例a的属性__doc__的值,即类的说明信息
help(a) #输出类的帮助信息
print(a.__doc__)
的输出如下:
This is my first class
help(a)
的输出如下:
Help on MyClass in module __main__ object:
class MyClass(builtins.object)
| This is my first class
|
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
从 class MyClass(builtins.object)
可以看出,MyClass类自动继承了builtins.object 这个类,后面显示的属性就是从它继承而来。
如果在类中定义了函数,也可以用实例来调用它,接下来会说到。
注意:一般来说,为了区分定义在类内部的函数和外部的全局函数,会把类中定义的函数称为方法。