Python是典型的面向对象的语言,所以具备着面向对象的三大特征:
封装:将属性与方法放到类的内部,通过对象访问属性和方法,隐藏功能实现的细节
继承:子类复用父类中已经定义的属性和方法
多态:不同子类对象调用相同父类方法,产生不同的执行结果
我们先来看封装具体是什么?封装其本质就是将 属性 、方法封装在一个类中;在使用类创建对象时,我们可以直接调用属性和方法,从而不用去关心类中具体实现的细节和过程。至此我们发现在探讨封装、继承、多态等特征时,频繁提及几个概念:类,对象,属性,方法;它们又具体是什么呢,我们先来考究一下。
# 1. 类与对象
类: 对一群具有相同特征(属性)或行为(方法)的事物统称,类是个抽象的概念,不能直接使用。
对象:由类创建出的具体实例,包含类的所有属性与方法,可以直接使用
怎么正确理解类与对象呢:
1> 类是模板,对象是类的具体体现。如飞机、汽车都是类,而C919/RAV4就是具体的对象。在这里飞机汽车都是抽象的概念,具体的型号C919/RAV4才是抽象概念的物化。
2> 类中定义了 属性与方法
3> 先有类,再有对象;类只有一个,对象有多个,不同对象间属性可能会不尽相同
4> 对象继承类的属性与方法
# 2. dir()内置函数
都说Python中一切皆对象,我们所看到的变量、数据、函数等都是对象,是对象就可以调用方法,那么我们怎么来验证?
1> 在标识符/数据后面输入 .后使用Tab,Python就会提示该对象能够调用的方法列表。这个在日常使用中比较频繁,尤其是在忘记某方法时可以快捷的来查询。
2> 使用内置函数dir(),将标识符/数据传递给dir,同样可以看到对象的属性及方法;这些格式为 __方法名__ 的方法都是Python提供的 内置方法/属性
通过以下在jupyter notebook中的验证,可以体会到Python中一切皆对象的含义了
dir()
常见的方法
# 3. 类与对象的创建
1> 类的设计注意几点:需求分析,定义清楚所有涉及的类,一般为名词
类的三要素:类名(大驼峰命名法)、属性(特征的描述)、方法(行为的描述)
在一个类中封装多个方法,通过该类创建的对象就可以直接调用这些方法
类的基本格式:
# 类的命名要符合大驼峰命名规则
class 类名:
def 方法1(self,参数):
pass
def 方法2(self,参数):
pass
注意:方法的定义格式与函数的定义基本一致,但注意方法中第一个参数必须为 self
2> 对象创建
基本格式:
对象变量名= 类名()
如下我们定义了一个 fish() 的类;然后调用类创建了一个 名为 Tom对象,最后使用 对象Tom 调用了fish类中 eat() 方法。
定义类、创建对象、调用方法引用同一类所创建的对象是相互独立,是不相同的。
创建多个对象
# 4. self 参数的理解
self参数可以理解为就是对象本身;如下图我们使用直接外部赋值方法为对象 Tom 新增了 name属性,Tom调用了 eat()方法,在eat的self中就可以直接使用 self.name 来引用
self参数
# 5. 初始化方法
1> __ init__初始化
__init__:创建对象操作 var = 类名()时,会自动进行以下2个操作:为对象在内存中分配空间 --创建对象
为属性设置初始值 -- 初始化方法(init)
__init__ 方法 就是专门用来定义一个类 具有哪些属性的方法,定义默认的属性
__init__ 设置
2> 类的新增属性
类的属性要在类的内部定义,使用如下格式新增类的属性
self.属性名 = 形参
注意:
类的内部定义的变量可以在类的内部引用
类的属性新增
3> __str__ 方法
若我们想要自己打印输出自定义的字符串,就需要使用 __str__方法
def__str__(self):
return string
注意:__str__ 必须返回一个字符串
# 6. 封装
我们了解了什么是类,什么是对象后再来具体看封装。这里再回顾一下什么是封装。
封装就是将属性与方法定义封装在抽象的类内部,在外部使用由类创建的对象,对象可以直接调用方法,而属性的细节和方法具体实现过程都是在类的内部。
封装属性与方法
如示例所示,属性:name、weight 方法:run、eat
同一个类创建的不同对象间相互独立,互不影响。
封装
这里我们就初步了解类与对象的关系,属性与方法的具体封装过程。后面有篇幅盈长将专门使用示例说明封装的细节。