面向对象编程
- 一.什么是面向对象编程
- 1.1面向过程编程
- 1.2面向对象编程
- 1.3类与对象的关系
- 二.对象使用
- 2.1 创建类
- 2.2 实例化对象
- 2.3属性修改
- 2.4私有属性 类方法
- 2.5静态方法
- 三.封装
- 四.继承
- 五.多态
一.什么是面向对象编程
1.1面向过程编程
要之前的学习中,我们用到的思想叫做面向过程编程(Procedure Orientedprogramming),简称POP
顾名思义该思想是站在过程的角度思考问题,强调的就是功能的执行过程,即先干啥,后干啥。而每一个功能我们都使用函数(类似于方法)把这些步骤一步一步实现,使用的时候依次调用函数就可以了。
1.2面向对象编程
Object-Oriented Programming
思想:物以类聚,分类。
本质:以类的方式组织代码,以对象的方式封装数据
优点:面向对象更加符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。
在我们身边有很多这种思维方式。
例如:
这既是我们的面向对象的思维方式,带入到我们的代码中我们会有这样几个名词:
- 类:一种抽象的数据类型,定义或者描述了某一类事物,类似现实中的人,车。类是对象的模板,关键词class。
- 对象:抽象概念(类)的具体实例,例如,一个叫张三的人,一两具体的车。
- 实例化:创建对象的过程。
- 属性:变量。代表类的基础属性。
- 方法:前面的博文已经讲过,相当于上图中的功能。
在面向对象中是会有面向过程的。不可以理解为面向对象一定就优于面向过程的设计。面向对象是基于面向过程的,永远不可能取代面向过程.
1.3类与对象的关系
先有类,后有对象。
类是对象的模板,对象是类的实例
二.对象使用
2.1 创建类
以学生为例
class Students:
#类属性
grade = '高三'
school = '乌丹一中'
#构造函数 给未来要创建的对象设置属性入口(实例属性) 只要实例化,构造函数自动执行
def __init__(self,name,gender,age): #self指的时实例化的对象本身
self.name = name
self.gender = gender
self.age = age
#实例方法
def study(self):
print(self.name + '正在学习')
带有__init__()的方法为构造方法。参数填未来要创建的对象的属性(实例属性),通俗的说就是由这个类创建的某个对象有哪些自己的特征。 例如每一个学生名字,性别不可能一样所以是实例属性。只要进行实例化,构造函数自动执行。
self指的是实例化的对象本身
2.2 实例化对象
#实例化
stu1 = Students('鑫鑫','男','21')
#查看属性
print(stu1.name)
print(stu1.gender)
print(stu1.age)
print(stu1.grade)
print(stu1.school)
#调用方法
stu1.study()
- 本例中self = stu1
- 实例化:
对象名 = 类名(实例属性)
- 查看属性:
对象名.属性
- 调用方法:
对象名.方法名(参数)
- 带有self都是属于实例的
- 类的属性方法公用,每一个对象都可以调用
2.3属性修改
#类属性修改
Students.grade = '大一'
#实例属性修改
stu1.age = 22
- 类属性修改:
类名.属性 = 修改值
- 实例属性修改:
对象名.属性 = 修改值
2.4私有属性 类方法
如果有一些数据我们不想有人从外部修改或者查看参数,我们可以添加私有属性
类方法用来处理私有属性
class Students:
# 类属性
grade = '高三'
school = '乌丹一中'
# 私有属性
__stu_total = 0
# 构造函数 给未来要创建的对象设置属性入口(实例属性) 只要实例化,构造函数自动执行
def __init__(self, name, gender, age): # self指的时实例化的对象本身
self.name = name
self.gender = gender
self.age = age
Students.__stu_total = Students.__stu_total + 1
# 实例方法
def study(self):
print(self.name + '正在学习')
# 类方法
@classmethod
def total(cls):
print('学生总数:%d' %(cls.__stu_total))
print()
# 实例化
stu1 = Students('鑫鑫', '男', '21')
stu2 = Students('磊磊', '男', '21')
# 调用
Students.total()
- 私有属性定义:双下划线+属性名,只可以在类内部访问
- 类方法:需要装饰器@classmethod,方法参数是cls,也就是class
2.5静态方法
当一个方法与类,实例不产生关联调用等关系时,我们可以使用静态方法
#静态方法
@staticmethod
def info():
print('可通过点击详情查看更多信息')
Students.info()
stu1.info()
三.封装
如字面意思,将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。前面学到的私有属性就是封装。
class Student(object):
def __init__(self,name,age,sex):
self.__name = name
self.__age = age
self.__sex = sex
one = Student('plf',18,'男')
print(one.__name) # 报错,无该属性
print(one.name) #报错,无该属性
print(one._Student__name)
print(one._Student__age)
print(one._Student__sex)
one._Student__age = 20
print(one._Student__age)
- 此时发现,使用one.name或者one.__name访问不到该属性。
- 但是我们可使用one._Student__age访问到对象的age属性并且能修改。说明python在设置私有属性的时候,只是把属性的名字换成了其他的名字。
- 虽然我们可以通过这种方式获取或者修改,但是约定俗成是不能这样做的
四.继承
继承是类与类的一种关系。比如“男人,女人”继承“人”,这里人类是男人,女人类的父类或者基类,男人,女人类类是人类的子类或者派生类。如下图所示:
代码实现
class OverseasStudent(Students):
def __init__(self,nation,name, gender, age):
super().__init__(name, gender, age) #对父类进行初始化
self.nation = nation
def study(self): #重写父类方法
print('我叫%s,我来自%s' %(self.name,self.nation))
stu3 = OverseasStudent('美国','Iron Man', '男', 20)
print(stu3.nation)
print(stu3.name)
print(stu3.gender)
print(stu3.age)
print(stu3.school)
stu3.study()
- 继承只需要在新建子类名的后面添加括号,并写入要继承的父类名称
- 子类中需要对父类进行初始化,super()代表父类
- 对父类进行方法重写后,会执行子类方法,父类不再执行
- 子类可也以再新加方法,实现‘青出于蓝而胜于蓝’
五.多态
*简单理解,父类拥有一个方法,不同的子类也都有这个方法,当我们调用时会执行相应的方法
- 多态前提:继承,重写
- 多态符合开闭原则::
对扩展开放(Open for extension):允许子类重写方法函数
对修改封闭(Closed for modification):不重写,直接继承父类方法函数
会员例子
class Member():
def __init__(self,name,age):
self.name = name
self.age = age
def status(self):
print('')
class Vip(Member):
def __init__(self,name,age):
self.name = name
self.age = age
def status(self):
print('VIP会员')
class NonVip(Member):
def __init__(self,name,age):
self.name = name
self.age = age
def status(self):
print('普通会员')
def userCheck(obj): #多态的关键,可以叫接口
obj.status()
mem1 =Vip('鑫鑫',22)
mem2 =NonVip('磊磊',20)
userCheck(mem1)
userCheck(mem2)