类和对象
What(是什么)
- 类是什么?对象又是什么?
- 首先了解下封装的概念:把乱七八糟的数据扔进列表里面,这是一种封装;把常用的代码打包成一个函数,这也是一种封装。
- 对象就是这种封装思想的进一步,把数据和代码封装在一块。它源于真实世界。
- 比如,乌龟是真实世界的一个对象,那么怎么来描述这个对象呢(乌龟)?分成两部分:
- 从静态的特征:黑色的,四条腿,5kg重,有外壳等等。
- 从动态的行为:会爬,会咬人,吃东西,睡觉等等。
- 再举个例子:
- 如在真实世界中的校园有学生和老师,学生有学号、姓名、班级等(属性),还有学习、吃饭、走路等行为(方法)。
- 如果开发一个校园管理系统,那么在构建的时候,有老师和学生等“类”;也有张三、李四作为学生类里面的个体,这就是“对象”。
- 如下图的汽车
- 这种思想,有哲学方面的考究,如柏拉图的理念论,现实世界的个体(对象)是理念(模型)的投影(类)。
- 简单来说,类是一种高级抽象,就是一种高级的数据类型,是对象的蓝图,就是用来定义你要用的对象的属性和行为的。
Why(为什么)
- 为什么要用到类与对象呢?
- 先说作用:类里面可以写实现一些功能的代码,可以减少代码的复用。
- 这种编程思想的精髓就在:封装、继承、多态,这个我们后面会说怎么应用。
- 类与对象是同时出现的,光有类,只有模型,没有对其实际操作的对象,是什么都干不了的。
How(怎么用)
- 知道了是什么,为什么,接下来就是怎么用呢?
定义类
- 语法:
- 如上面的小汽车:
创建对象
- 类是模板,根据模板创建的实例,也就是“对象”。
- 如图
类的成员
- 在类体中可以包含类的成员。
- 成员变量:保存类或对象的属性。(变量)
- 构造方法:一种特殊的函数,初始化类的成员变量。
- 成员方法:类中定义的函数。(方法/行动)
- 属性:对类进行封装而提供的特殊方法。
- 实例变量/方法与类变量/方法的区别:实例变量/方法属于对象,通过对象调用;类变量/方法属于类,通过类调用。
实例变量
- 对象个体特有的“数据”。
- 类中的self表示当前对象,构造方法中的self参数说明了这个方法属于实例,self.age表示age属于实例,即实例成员变量。
构造方法
- 用来创建和初始化实例变量。
- 第1个参数是self,后面的参数用来初始化实例变量。调用构造方法就不用传入self参数了。
实例方法
- 某个实例(对象)个体特有的方法。
- 第一个参数self,绑定实例与方法,调用是不需要传入self。
类变量
- 属于类的变量,不属于单个对象。
- 如,一个银行账户的类,三个变量:账户金额、利率、账户名。利率是相同的,账户金额跟账户名是不同的。 所以利率是类变量(所有实例成员共享的),其余两个是实例变量。
类方法
- 属于类,不属于个体对象。
- 第1个参数不是self,而是类本身。
- 注意:类方法不能访问实例方法和实例变量。
封装性
- 面向对象的基本特性之一。
- 封装隐藏对象内部细节,保留有限的对外接口,使操作对象格外简单。
私有变量
- 内部数据(成员变量)会被封装为“私有变量”,外部调用者只能通过方法调用。
- python默认变量是公有的,前面加
__
(双下划线),即变成私有变量。
私有方法
- 同理,在定义方法时加上
__
(双下划线),即变成私有方法。
使用属性
-
为了实现对象的封装,一个类中,不该有公有的成员变量,这些成员变量都应该设为私有的,然后通过公有的set和get方法访问。
class Dog(): def __init__(self, name, age, sex="雄性"): self.name = name self.__age = age self.sex = sex def run(self): print("{}在跑...".format(self.name)) # 定义get()方法,返回私有实例变量__age def get_age(self): return self.__age # 定义set()方法,通过age参数更新私有实例变量__age def set_age(self, age): self.__age = age d = Dog(