面向对象编程

  • 一.什么是面向对象编程
  • 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
思想:物以类聚,分类。
本质:以类的方式组织代码,以对象的方式封装数据
优点:面向对象更加符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。

在我们身边有很多这种思维方式。

例如:

python 电池Open Circuit Voltage python spectrogram_私有属性


这既是我们的面向对象的思维方式,带入到我们的代码中我们会有这样几个名词:

  • 类:一种抽象的数据类型,定义或者描述了某一类事物,类似现实中的人,车。类是对象的模板,关键词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在设置私有属性的时候,只是把属性的名字换成了其他的名字。
  • 虽然我们可以通过这种方式获取或者修改,但是约定俗成是不能这样做的

四.继承

继承是类与类的一种关系。比如“男人,女人”继承“人”,这里人类是男人,女人类的父类或者基类,男人,女人类类是人类的子类或者派生类。如下图所示:

python 电池Open Circuit Voltage python spectrogram_私有属性_02

代码实现

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)