博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解面向对象编程(OOP Object Oriented Programming)
阅读量:4574 次
发布时间:2019-06-08

本文共 3549 字,大约阅读时间需要 11 分钟。

理解面向对象编程(OOP: Object Oriented Programming)

面向过程与面向对象

什么是面向过程编程?

答:按照先干什么、再干什么、最后干什么的思路。事情都自己干,流水线,程序员是打工仔视角

​ 优点:使复杂的问题简单化、流程化

​ 缺点:可扩展性差

什么是面向对象编程?

答:在面向对象编程中,程序员就好像是在创造一个世界,在这个世界中,程序员创造了一个个对象,用来帮自己解决问题。事情都交给对象干,程序员是老板视角。

​ 优点:可扩展性强

​ 缺点:复杂度略到与面向过程

对象和类的概念

对象:

  • 特征(变量)与技能(函数)的结合体。
  • 对象是具体的存在的事物

类:

  • 一系列对象的相同特征(变量)与技能(函数。)的结合体
  • 类是抽象的概念

在现实世界中:是先有具体的对象,然后将这些具有相同特征和技能的对象归结为一个类。比如:是先有人这个对象,然后把所有人归结为人类这个抽象的概念。

在程序中:是先定义一个类,然后由这个类,实例化为一个个对象。

在一个类中,最常定义的是变量和函数。重点:类体代码会在定义阶段就执行,然后产生一个类名称空间,将类体代码中产生的名称,丢进类名称空间中。

类里的函数里面的代码体只有调用的时候才执行,**但是,类里面的__init__函数会在定义的时候就执行。**

#查看类名称空间里面的名称:__dict__class Student:        school = '社会大学'    def __init__(self, name):        self.name = name            def study(self):        print('我是学生,我会学习') print(Student.__dict__) '''结果:{'__module__': '__main__', 'school': '中北大学', '__init__': 
, 'study':
, '__dict__':
, '__weakref__':
, '__doc__': None}school、study、__init__: 类定义时产生的名称__module__:当前文件的模块,因为是执行文件,所以是__main____doc__:类的文档注释'''print(Student.school) #结果:社会大学 #相当于:print(Student.__dict__['school'])print(Student.study) #结果:
#相当于:print(Student.__dict__['study'])Student.school = '北京大学' # 相当于Student.__dict__['school'] = '北京大学'

(****)类本质就是一个名称空间,里面存放变量和函数的名字,是一个存放变量和函数的容器

类的用途之一:从名称空间中找名字

类的用途之二:生对象

类中定义的变量是所有对象共享的,如果类改变了该变量,所有对象.这个变量的时候都会改变。对象是不能改变类的变量的,对象.一个类变量,并没有改变类的这个变量,本质上是在自己对象的命名空间中添加了一个属性。

class Student:    age = 18    def __init__(self):        pass      stu1 = Student()stu2 = Student()print(stu1.age) # 18print(stu2.age) # 18Student.age = 10print(stu1.age) # 10print(stu2.age) # 10stu1.age = 20print(stu1.age)  # 20print(stu2.age)  # 10print(stu1.__dict__)  # {'age': 20}

对象

调用类可以产生对象。

调用类之后的返回值称为一个对象/实例。

调用类的过程称为类的实例化。

对象的本质也是一个命名空间。如果类的init没有参数,对象的命名空间为空。

例1:class Student:        def __init__(self):        print(1)        stu = Student()print(stu.__dict__)  #结果:{}例2:class Student:    def __init__(self, name):        self.name = name         stu = Student('你爹')print(stu.__dict__)  #结果:{'name':'你爹'}

重点:调用类发生了什么?

1、生成一个空对象返回

2、触发类中init函数的执行,将这个空对象传给init的第一个参数。调用类括号内的参数再一次传给init第一个参数后面的参数。

init补充:1、init函数在类调用的时候就执行了。2、init函数不能有返回值。

属性查找顺序

对象.属性,.后面的叫做属性

对象.属性的时候,现在对象的命名空间里面找有没有这个属性,如果没有,就从类的名称空间里面找属性。

class Student:    school = '中北大学'    age = 18    def __init__(self, name):        self.name = name    def study(self):        print(1)stu = Student('你爹')print(stu.name)  print(stu.age)'''说明:stu的命名空间只有name, stu.__dict__ = {'name':'你爹'}, 没有age,这时候就在类的名称空间中找。类名称空间在类定义的时候有:school, age, __init__, study等,有age,则返回18'''

绑定方法: 当函数的逻辑中需要访问对象时,那就绑定给对象,仅需要类中数据就绑定给类

1、类中定义的变量类可以用,对象也可以用。不管谁调用,都指向同一个地址。类变量值一旦改变,所有对象调用时都跟着变。

class Student:    age = 18    def __init__(self):        passstu = Student()print(id(stu.age))  # 4362244432print(id(Student.age)) # 4362244432Student.age = 20stu1 = Student()print(stu.age)  # 20print(stu1.age) # 20

2、类中定义的函数,类也可以用,类调用的时候,这个函数就是一个普通的函数。类中定义的函数是用来给对象用的。而且是绑定给对象用的。

什么叫绑定给对象?

class Student:    school = 'oldboy'    def __init__(self, name, age, sex):        self.name = name #stu1.name='小白'        self.age = age   #stu1.age=18        self.sex = sex   #stu1.sex='male'    def choose_course(self,x): #self=stu1        print('%s choosing course' %self.name)        stu1=Student('小白',18,'male')  # 小白 choosing coursestu2=Student('小花',38,'female') # 小花 choosing coursestu3=Student('小黑',28,'male') # 小黑 choosing course'''如上,用类实例化了三个对象,三个对象分别调用类里面的函数。调用时,会自动把对象传给类函数的第一个参数。也就是说,类方法分别绑定给了不同的对象,哪个对象调用,用到的就是哪个对象的名称空间。不同对象互不干扰。'''

转载于:https://www.cnblogs.com/KbMan/p/11241406.html

你可能感兴趣的文章
Springboot拦截器线上代码失效
查看>>
WCF初探-2:手动实现WCF程序
查看>>
好程序员技术分享html5和JavaScript的区别
查看>>
好程序员web前端分享CSS3文本属性
查看>>
ThinkPHP3.0启动过程
查看>>
Java入门 之 类和对象(一) - 类
查看>>
16级第二周寒假作业E题
查看>>
Java实现Windows锁屏
查看>>
在线会话管理
查看>>
文本处理之可视化wordcloud
查看>>
SampleManager(赛默飞)
查看>>
堆排序
查看>>
我的面试问题记录
查看>>
函数PARSENAME使用和截取字符串
查看>>
关乎性能的判断,请作出果断选择
查看>>
判断是否包含指定的字符
查看>>
[Html5] HTML5 开发手机应用
查看>>
[工具] 各种主流 SQLServer 迁移到 MySQL 工具对比
查看>>
(二)Maven 基本概念——依赖、生命周期、仓库管理、聚合&继承
查看>>
py4CV例子3Mnist识别和ANN
查看>>