面向对象

编程范式

对不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式
分为两类:面向过程编程和面向对象编程

面向过程编程(Procedural Programming)

面向过程:过程指的是解决问题的步骤,机械式的思维方式
优点:复杂的问题流程化,进而简单化
缺点:可扩展性差,如果添加功能需要修改一整个流水线

面向对象编程(Object Oriented Programing)

面向对象:核心就是对象,对象是特征与技能的结合体,站在上帝的视角来模拟这个世界
优点:可扩展性强
缺点:编程复杂度高
应用场景:用户需求经常变化,互联网应用,游戏(改游戏参数),企业内部应用

三大特性:

  • Encapsulation 封装
    在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
  • Inheritance 继承
    一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
  • Polymorphism 多态
    多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。

面向对象介绍

1.类

类就是一系列对象相似的特征与技能的结合体
强调:站在不同的角度,得到的分类是不一样的
在现实世界中:先有对象,后总结出来类
在程序中:先定义类,后调用类来产生对象;类似开公司招聘,会先分好各部门招聘人才的特征需求(类),再进行对人招聘(对象)
举例:
在现实世界中:

  • 对象1:王二丫
    特征:
    学校=luffycity
    姓名=王二丫
    性别=女
    年龄=18
    技能:吃饭,睡觉,学习
  • 对象2:李三炮
    特征:
    学校=luffycity
    姓名=李三炮
    性别=男
    年龄=38
    技能:吃饭,睡觉,学习
  • 对象3:张铁蛋
    特征:
    学校=luffycity
    姓名=张铁蛋
    性别=男
    年龄=48
    技能:吃饭,睡觉,学习
    总结现实中luffycity的学生类:
    相似的特征:学校=luffycity
    相似的技能:吃饭,睡觉,学习
    在程序中:

2.如何使用类

不同于函数,类在class定义类的时候就会执行类体(类的内部代码)

  • 查看类的名称空间

  • 查看类的内部变量(数据属性)和函数(函数属性)

可以类似import模块用类名加点
Luffycity.school等同于Luffycity._ dict _[“school”]

  • 增加类的内部变量

Luffycity.country = “China”? #将新增的变量名country作为key,China作为value传入类的名称空间

  • 删除类的内部变量

del Luffycity.country

  • 修改类的内部变量

Luffycity.school = “”Luffycity”

3.如何使用对象

_ init _方法用来为对象定制对象自己独有的特征,注意——init——函数在类的调用或者实例化时会进行执行,可以有任意代码,但一定不能有返回值

  • 加上——init——方法后实例化的步骤:
  1. 先产生一个空对象stu1
  2. 再调用——init——函数Luffycity. _init _(self)为对象增加独有属性,self就是刚刚产生的对象
  3. 其实init函数就是将独有属性加入到对象的名称空间里
  • 查询对象属性
    stu1.Name
  • 增加对象属性
    stu1.Class = “A班”
  • 修改对象属性
    stu1.Name = “杨飞”
  • 删除对象属性
    del stu1.Name

4.属性查找与绑定方法

  • 类中的数据属性:是所有对象共有的

  • 类中的函数属性

是绑定给对象使用的,绑定到不同对象是不同的绑定方法

对象调用绑定方法时,会把对象本身当做第一个参数传给self

Luffycity.learn(stu1)是直接类调用函数属性,需要将一个生成的对象作为参数传进去,因为learn(self)函数要求传一个参数
stu1.learn(hard)是通过对象调用绑定的函数属性,他会将对象本身作为第一个参数传给self,然后“hard”作为参数传给x

  • 对象在查找属性时,在名称空间查找的顺序是:先在对象内查找,再去类中查找,再去父类中查找,如果查找不到报错,并不会去全局变量中查找

5.补充说明

  • 站的角度不同,定义出的类是截然不同的;
  • 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类等;
  • 有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类。

Python中一切皆对象,在python3中统一了类与类型的概念

如:l1 = [1,2,3],list其实就是属于类,赋值其实就是list类实例化对象的过程
?l1.append(4)其实就是调用了list类的函数属性,将l1作为self传给函数参数,本质与list.append(l1,4)是一个效果

总结面向对象的优点——可扩展性高

定义类并产生三个对象class Chinese:    def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexp1=Chinese('egon',18,'male')p2=Chinese('alex',38,'female')p3=Chinese('wpq',48,'female')如果我们新增一个类属性,将会立刻反映给所有对象,而对象却无需修改class Chinese:    country='China'    def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sex    def tell_info(self):info='''国籍:%s姓名:%s年龄:%s性别:%s''' %(self.country,self.name,self.age,self.sex)print(info)p1=Chinese('egon',18,'male')p2=Chinese('alex',38,'female')p3=Chinese('wpq',48,'female')来源:Kerwin_YF
                                                        

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月9日
下一篇 2020年1月9日

相关推荐