Python_面向对象
面向对象编程的理解_国内教程
基础概念
我们经常在书中看到这样的概念:
- 程序 = 指令 + 数据
- 程序 = 算法 + 数据结构
我最初一直认为这是两种毫不相关的的看法,但隐约又觉得有些联系,直到今天在学习到对象编程时,对这两个公式又有了新的理解,原来这两个公式有一个意思,只不过是看待的角度不同的罢了!算法通过指令构成或指令组成了算法,数据要通过数据结构进行承载体现。
代码可以选择以指令为中心或是以数据为中心,前者被称为面向过程的编程,后者被称为面向对象的编程。
面向过程的通俗理解:面向过程的编程就以一系列操作(指令)为核心,在指令运行的过程当中不断地填充数据。整个过程指令为主,数据为辅。
面向过程的书面理解:”程序通过一系列线形步骤,以代码指令为核心,代码作用于数据,围绕正在发生什么进行编写代码。
面对对象的通俗理解:先去组织数据,自行去设计数据结构,并且定义一些能够施加在此类数据上的操作。
面向对象的书面理解:用数据控制对代码的访问,围绕数据,为数据严格定义的接口来组织程序,代码控制过程当中绝不能绕过数据。
以下是国外的教程当中对于面向过程和面向对象的一段”高层“解释,我当前是看不懂的:
所有编程语言的最终目的都是提供一种抽象的方法。在机器模型(”解空间“ 或”方案空间“)与实际解决的问题模型(问题)之间”,程序员必须建立一种联系。
面向过程:程序=算法 + 数据结构
面对对象:将问题空间中的元素以及它们在解空间中的表示物抽象为对象,并允许通过问题来描述问题而不是方案。可以把实例想象成为一种新型变量,它保存着数据,但可以对自身的数据执行操作。
新型变量—实例
- 定义一个类后,可以根据需要实例化多个对象
- 如何利用对象完成真正有用的工作
- 必须有一种方法能向对象发出请求,令其做一些事情
- 每个对象仅能接收特定的请求
- 能向对象发送的请求由其“接口”进行定义,这里的接口指的就是函数或方法
- 对象的“类型”或“类”规定了它的接口形式
- 如何利用对象完成真正有用的工作
我们来看一下普通的变量,如下所示:
# 例一:name是一个变量,name变量本身可以对自己施加特定的操作
# 比如,追加或删除一个数值
name = [1,2,3]
name.append(4)
# 例二:a是一个变量,a变量本身可以对自己施加特定的操作
a = 1
a = a + 1
如上所示,变量拥有对自身施加特定操作的能力,而实例同样拥有这种能力,等下,等下,什么是实例?
什么是实例?
实例是类和对象结合之后具像化的产物,如下代码当中的my_dog:
class Dog:
'''一次模块小狗的简单尝试'''
def __init__(self,name,age):
'''初始化属性name和age'''
self.name = name
self.age = age
def sit(self):
'''模拟小狗收到命令时蹲下'''
print(f'{self.name} is now sitting.')
def roll_over(self):
print(f'{self.name} roll over!')
# 两个函数就是两个方法,下面我们就来调用一下两个方法。
my_dog = Dog('wangcai','2')
my_dog.sit()
my_dog.roll_over()
"C:\Program Files\Python311\python.exe" G:\python2\黑客.py
wangcai is now sitting.
wangcai roll over!
class Dog中的Dog是类,wangcai和数字2是数据,当类和和数据”合体“执行之后也就形成了倒数第六行当中的my_dog实例。
有了类和数据还不够吗?为什么还要有实例?
当前定义的类是狗子,狗子是抽象的概念,狗子是什么颜色?什么品种?多大年龄?这些类当然统统都不知道,类只是一个”通用框架“,是一种抽象概念不能拿来直接使用。而数据更不能单单拿来使用了,比如上文当中的旺财,2,如果单纯只有数据,我们都不知道旺财是人是狗?2是什么意思?
只有当Dog(类)和数据(对象)结合到一起时,才能完整的描述事物,完成从抽象到具象的转变,这种由抽象到具象的转变需要由实例来承载,即上述代码当中的my_dog。
实例当中的特定操作来自哪里?
变量拥有对自身施加特定操作的能力,实例也是一种新型变量,这里的指的特定操作就是方法,而方法其实就是来自于类当中的函数而已,如上文当中的sit和roll_over。
在调用特定方法的时候为什么不能直接调用类?而要调用实例?
在上文当中我们看到我们再调用Dog类中sit时,并没有直接调用类,而是直接调用具像化后的实例my_dog,为什么呢?其实很简单,类当中没有数据,实例里面有数据,我们想要有数据的结果!
类和对象的书面解释
关于类的书面解释:
-
类即类型,类由状态集合(数据)和转换这些状态的操作集合组成。
- 类抽象:
- 类:定义了被多个同一类型对象的结构和行为(数据和代码)
- 类的数据和代码,即类的成员
- 数据:成员变量或实例变量
- 成员方法:简称为方法、是操作数据的代码、用于定义如何使用成员变量,因为一个类的行为和接口是通过就去来定义的,这里面的方法指的函数。
- 方法和变量:
- 私有:内部使用,仅类内部可用,实例不可调用
- 公共:外部可见,实例亦可调用
- 类抽象:
-
类:将同一种具体事物的共同特性抽象出来的表现
- 状态和转发这些状态的操作
- 数据:
- 变量、就是属性
- 方法:
- 函数:操作变量引用的数据的代码
关于对象的书面解释:
- 所有东西都对象
- 程序是一大堆对象的组合
- 通过消息传递,各对象知道自己该做什么
- 消息,即调用请求,它调用的是从属于目标对象的一个方法
- 每个对象都拥有自己的存储空间,可以制作成新型对象
- 通过封装现有对象,可以制作成新型对象
- 每个对象都属于某一类
- 类型:也即类
- 对象是类的实例
- 类的一个重要特征为“能发什么样的消息给它”
- 同一类的所有对象都能接收相同的消息
面对对象的编程_美国教程
类、对象、实例
不同的老师对同一个知识点会有不同的阐释,比如我当前这个在YOUTUBE当中看到的教程,在为什么要有类方面的解释跟国内的很多讲师就有很多的不同!
为什么要有类?
python我们知道已经有一些基本的数据类型,比如说字符串、整形、浮点数、布尔值,我们也有一些集中结构,比如说列表、字典、元组,但问题时并不是所有的数据都可以用字符串、数字、布尔值去表示,比如手机、电脑,这个时候我们要就要创建自己的数据类型,而类的就是帮助我们创建自己的数据类型,一个类就是一个新的数据类型,每一种语言都采用这种设计。
类是什么?
比如用类来描述一位女生,我们关心颜值、身材、年龄、性格,这就是类,就是描述或概念,里面没有具体的数据,数据是外面传进去的;
什么是对象?
对象指的就类当中需要的具体的数据,比如95分、100分,26、温柔娴淑
实例是什么?
针类和对象结合起来使其具体化,由虚入实,比如说身高必须超过一米、瓜子脸、具体化完成之后,这个东西就叫实例。
类和对象结合起来就大概有画面了,如下所示:
颜值 | 身材 | 年龄 | 性格 |
---|---|---|---|
95分 | 100分 | 26 | 温柔娴淑 |
PS: 类是抽象还是具体的?类是抽象的分类
PS: 对象是抽象还是具体的?也是抽象的
PS: 将类和对象结合起全生成的实例是具体的还是抽象的?实例是具体的
代码分析
# 定义一个类phone
class phone:
# OS是操作系统
# number指的是型号
# is_waterproof指的是是否防水
def __init__(self,os,number,is_waterproof):
self.os = os
self.number = number
self.is_waterproof = is_waterproof
phone1 = phone("ios",14,True)
# 我们是通过实例来打印其中的属性的(变量)
print(phone1.number)
phone2 = phone("andriod",20,False)
print(phone2.os)
"C:\Program Files\Python311\python.exe" G:\python2\TESTT123.py
14
andriod
- 安卓手册和苹果手机都属性手机这个分类,所以我们定义一个分类叫phone。
- def这是“定义”的缩写,和init一样是固定写法,小括号进而的self是什么意思?其实就是指的phone这个类,代表本身。这个地方很好理解,我们写函数体的时候第一行就可以接收对象,而在这里,phone不能直接接收对象,所以需要在self当中接收对象,就用os、number、is_waterprooof去承接。
- 而self.os是什么?这些就是在类体当中可以使用的变量,必须得把前面的self写上,否则在类体不能直接调用!
- phone1 = phone("ios",14,True) 向phone类当中传递数据(对象),直接就用实例去承载了,必须要这样,类和对象都虚拟的,我们如果想调用类当中的函数,就必须将类和对象赋值给实例,不能直接使用类去调用函数,因为类当中没有数据!
面向对象的编程_台湾教程
什么是Class(类)
简单来说,类就是物件(object)的设计图。我们可以相像今天要设计一个猫咪物件(object),我们就衔画出一只猫咪的设计图,也就是类。
-
格式:
class 自己取的类名字(要继承的类): # 建构子 def __init__(self,物件初始化参数) 程式变量,用于承接参数 # 方法method def 自定义方法(self,自定义所需参的函数) 程式逻辑
# CAT的设计图
class cat:
# 建构子
def __init__(self):
self.color = "Red" # 属性,Attribute
self.legs = "Long" # 属性,是否腿长
# 方法(Method),猫咪的动作
def run(self):
print("Cat is running!")
def eat(self):
print("Cat is eatting!")
# 将其实例化
nash = cat()
# 通过实例调用猫咪的方法(动作)
nash.run()
nash.eat()
"C:\Program Files\Python311\python.exe" G:\python2\TESTT123.py
Cat is running!
Cat is eatting!