一.什么是面向对象编程
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.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.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)
|