python 中的面向对象

2023-10-27

目录

面向对象基础

面向对象 / 面向过程

面向过程编程

面向对象基本概念

面向对象-类和对象

对象

类和对象的关系:

类的设计

定义类名

属性和方法的确定

面向对象基本语法

定义简单的类(只包含方法)

定义类

self的使用


面向对象基础

面向对象 / 面向过程

一个思想、理论、逻辑。 独立于变成语言。理论来源于生活 、来源于人类的思考方式。

面向对象:适合解决大型、 复杂业务的项目 面向接口 面向过程 面向切片

面向过程:

根据业务逻辑从上到下写代码。 项目中解决部分问题的方案

注重步骤与过程,不注重职责分工,代码会变得很复杂,没有套路,开发难度很大!

面向对象:

变量与函数绑定到一起,分类进行封装,每个程序 只要负责分配给自己的分类能更快 速的开发程序,减少重复代码。整体项目解决方法(化简逻辑,让代码更简单)

抽象的概念:

面向对象的思想就是抽象的思想即人类认识世界的思想 ​ 面向对象的过程就是抽象的过程即人类认识世界的过程

面向过程编程

不推荐使用(了解即可)

面向过程编程的关注点在于怎么做

把完成某一个需求的 所有步骤 从头到尾 逐步实现。

根据开发需求,将某些 功能独立 的代码 封装 成一个又一个 函数。

最后完成的代码,就是顺序地调用 不同的函数。

面向过程编程特点:

  • 注重步骤与过程,不注重职责分工。

  • 如果需求复杂,代码会变得很复杂。

  • 开发复杂项目,没有固定的套路,开发难度很大!

面向对象基本概念

编程思想 -- 面向对象 -->整体项目解决方案

面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)和面相过程编程,是两种不同的编程方式。

作用:

责任分发,变量与函数绑定到一起,分类进行封装,快速的开发程序,减少了重复代码。

面向对象程序设计 独立于编程语言。

每个程序只要负责分配给自己的分类 ;(社会的进步表现在 分工的越来越明确 )。

面向对象编程的关注点在于谁来做方法=函数=行为=动作。(责任分发)

相比较函数,面向对象是更大的封装,根据职责在 一个对象中封装多个方法。

在完成某一个需求前,首先确定职责 —— 要做的事情(方法)。

根据 职责 确定不同的 对象,在对象内部封装不同的方法(多个)。

最后完成的代码,就是顺序地调用不同对象的相应方法。

面向对象特点:

  • 注重 对象和职责,不同的对象承担不同的职责。(分则)

  • 更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定套路。

做一些工作 :要解决问题 就要模拟问题!

  1. 定义类:

    将我大脑中的概念转移到 python中。 ​ 就在python中 定义一个类型、一个类别、一个模板。 ​ 使用 class 关键字、保留字 定义类。

  2. 类属性:

​ 增强一下画像 、印象、特征(特别提醒:只描述 你自己业务的关注点) ​ 属性 = 特征 (类属性)

  1. 定义功能函数:

    责任 = 功能 = 能力 = 行为 = 能力 = 函数 ​ 定义函数: 面向对象中把 任 = 功能 = 能力 = 行为 = 能力 = 函数 。统统定义为函数。 ​ 定义函数 可以很复杂 也可以很简单。 ​ 因为 函数可以写逻辑代码 ,可以包含多行内容。

  2. 计算机属于先下定义 、在创建模板。

    在现实生活中 :当我们看见遇见一个 实物 的时候:大脑会不自觉的去匹配大脑中的模板。

  3. 语法问题 : 1. 创建对象 对象名 = 类名() 2. 访问属性 、方法 对象名.属性名 /方法名 3. 属性赋值 对象名.属性名 = 值

面向对象-类和对象

对象面向对象编程的两个核心概念。 注意:在开发中 ,先有类,再定义对象。

类:是对一系列具有相同 特征行为的一个统称,抽象的,不能直接使用(不是真是存在的实物)

类的作用?

类是用来创建对象的

类:是概念 比如说(猫类 ,狗类 等 )

类:是一个概念 谁都可以定义 (经常要使用而且经常要自定义) 一类 :一定是具有相同特的。

  • 特征就是一个变量,在类里我们称之为属性(特征即是属性:类似于 洗衣机的宽高)。

  • 行为就是一个函数,在类里我们称之为方法(行为即是方法:类似于 洗衣机的功能)。

  • 类其实就是由 属性 和 方法 组成的一个抽象概念。

    属性 和 方法 是抽象来的。 是你观察,发现的相同点。可以说 : ​ 属性与方法被类 封装起来了/保护起来了。(在python中 缩进代表着 包含的意思)

总结:

  • 类属对象的抽象出来的

  • 对象是类的实例出来的

  • 万物皆对象 物 --->>> 实实在在的物体

  • 对象(拥有属性和方法的集合体)

对象

什么是对象:

对象是由类实例化出来真实存在的事物,可以直接使用。例如:图纸造出飞机 电视 洗衣机...

由那一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。

类和对象的关系:

用类去创建一个对象 , 可以把创建称之为实例化 亦可以用类去实例化一个对象。

  • 类是模板,对象是根据类这个模板创建的应该先有类,再有对象。

  • 使用同一个类,能够创建出n多个对象。要符合 is a 的关系。

  • 类中定义了什么属性和方法,对象中就有什么属性和方法。

  • 不同对象对应的属性值也会不同。

类的设计

在程序开发中,要设计一个类,通常需要满足一下三个要素:

  1. 类名: 这类事物的名字,安照大驼峰命名法(每个单词的首字母大写)起名

  2. 属性: 这类事物具有什么样的特征。== 属性

  3. 方法: 这类事物具有什么样的行为。== 函数

定义类名

名词提炼法:分析整个业务流程,出现的名词,通常就是找到的类。(可以两个名词拼接成的缩写)

注意:类名要满足标识符命名规则,同事要遵守大驼峰的命名习惯。(首字母大写)

属性和方法的确定

对象的特征描述,可以定义成属性

对象具有的行为(动词)可以定义成方法

练习需求1:

  • 小明今年18 岁,身高 1.75,每天早上跑完步,会去 吃 东西

  • 小美今年17 岁,身高 1.65,小美不跑步,小美喜欢 吃 东西

class Person(object):
    """ 这是一个人类 """
    # 类属性
    name = ''
    age = '12'
    height = '1.0'
​
    # 功能函数
    def run(self):
        # 判断 
        if self.name == '小明':
            print('每天每天早上跑完步,会去 吃 东西')
        elif self.name == '小美':
            print('小美不跑步,小美喜欢 吃 东西')
​
    def showInfo(self):
        print(f'{self.name}\t今年:{self.age}\t身高:{self.height}')
​
​
# 拦截 测试 
if __name__ == '__main__':
    ming = Person()
    ming.name = '小明'
    ming.run()
    ming.showInfo()

面向对象基本语法

在Python中,对象几乎是无处不在的,一切接对象 ;使用dir内置函数来查看这个对象里的方法。

在python 处处皆对象。

# 可以使用`dir`内置函数来查看这个对象里的方法。
a = []
print(dir(a)) # ['__add__', '__class__', '__class_getitem__'....

定义简单的类(只包含方法)

面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建出来的对象

对象名.方法/属性名 可以直接调用这些方法了!

什么是封装?

将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口

对外隐藏内部实现细节,并提供访问的接口

什么时候应该封装?

当有一些数据不希望外界可以直接修改时

当有一些函数不希望给外界使用时

为什么需要封装

1.为了保证 关键数据的安全性

2.对外部隐藏实现细节,隔离复杂度

定义类

手动添加属性 :对象名.属性名 = 赋值

获取 :类外面获取属性 print(对象名.属性名) 可以访问到值

类里面获取对象属性:self.属性名 = (属性名的值)

object -- 默认状态下 ,类不去继承自己书写得类 ,默认继承所有类的顶级类,就是object(父类,基类)

定义类中的方法

定义函数不要重名 一旦重名 调用的是最后一个(替换) ,也不要和类名重名。 ​ 命名规则 首字母小写其余单词首字母大写

# 方法里的第一个参数必须是self  、类名要遵守大驼峰命名法
class 类名(object):
    def 方法1(self,参数列表):
        pass
    def 方法2(self,参数列表):
        pass
​
​
class Dog(object):
    """ 这是一个狗类  """
    def run(self):
        print(f'{self.name}在奔跑')
​
    def set(self):
        print('狗狗在吃东西')
​
    def playPan(self):
        print('狗狗在玩耍')
​
​
if __name__ == '__main__':
    xiaoHang = Dog()  # 创建新对象 就会开辟新空间
    '''
      Python语法特点:
         脚本语言 解释性语言 可以动态给对象添加属性
         给对象添加属性 是添加到了某一个对象身上并不会影响其他对象和类模板
        
    '''
    # 类外面添加属性 对象名.属性名 = 赋值
    xiaoHang.name = '小黄'
    xiaoHang.run()
​
    xiaoHen = Dog()  # 创建新对象 就会开辟新空间
    xiaoHen.name = '小黑'
    xiaoHen.run()
​
    print(xiaoHen == xiaoHang)
    print(id(xiaoHen))
    print(id(xiaoHang))
​

创建对象

对象 又叫 实例(先有类 在创建对象)

对象名 = 类名()  # 类名() 等号赋值到 对象变量名  (变量名即使对象名)  

例子:

第一个面向对象代码

需求

  • 小猫 爱 吃 鱼,小猫 要 喝 水

分析

  • 定义一个猫类 Cat

  • 定义两个方法 eat 和 drink

  • 按照需求 —— 不需要定义属性

class Cat:
    """这是个猫类"""
​
    def eat(self):
        print("小猫在吃东西")
​
    def drink(self):
        print("小猫在喝水")
​
tom = Cat()           # 创建了一个Cat对象  开辟新空间
tom.eat()
tom.drink()
print(id(tom))    
​
hello_kitty = Cat()   # 又创建了一个新的Cat对象  开辟新空间
hello_kitty.eat()
hello_kitty.drink()
print(id(hello_kitty)) # 查看内存地址  id()将空间地址数值化

self的使用

给对象添加属性:python 是脚本语言.python支持动态属性,当一个对象创建好了以后,直接使用 对象.属性名 = 属性值 就可以很方便的给对象添加一个属性。(不建议使用这种方式给对象添加属性)

# 这种方法很方便,但是,不建议使用这种方式给对象添加属性。
tom = Cat()
tom.name = 'Tom'  # 可以直接给 tom 对象添加一个 name 属性
self的概念

self 表示 本身,作为函数的第一个参数,python语法默认提供 ,代表 当前调用此函数的对象。

对象为:return.__new__(cls) 开辟的空间

哪个对象调用了方法,方法里的self指的就是谁。

通过 self.属性名 可以访问到这个对象的属性;通过 self.方法名() 可以调用这个对象的方法。

class Cat:
    """这是个猫类"""
    '''
        self 代表调用这个函数的对象   
        没有定义属性值 ,通过self .  的形式调用这个对象的属性和函数
    '''
    
    def eat(self):
        print("小猫{}在吃东西".format(self.name))
        self.drink() # 使用self.方法名打印(drink内的方法内容)
​
def drink(self):
    print("小猫在喝水")
​
print('demo.py   ', __name__)
if __name__ == '__main__':
    tom = Cat()    # 创建了一个Cat对象
    tom.name='汤姆' 
    tom.eat()
    print(tom.name)
    print(id(tom))
​
​
    kt = Cat()
    kt.name="花花"
    print(kt.name)
    kt.eat()
​
这种方法很方便,但是,不建议使用这种方式给对象添加属性。
顺序掌握不好会报错 要注意先后顺序 (先定义属性,在调用)
​
"""
self是调用概函数的对象,打印对象内存地址,与打印self内存地址相同。
那个象调用了 washer方法 就会把 pi对象属性传入self 里面去
一个类 可以创建多个对象, 多个对象都调用方法函数(内存地址不同的)
创建一个对象调用方法 就会开辟新的空间
"""
​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 中的面向对象 的相关文章

  • PHP 中的 imagecolortransparent 不起作用

    我想改变图像中的白色 http www arso gov si vreme napovedi 20in 20podatki radar gif http www arso gov si vreme napovedi 20in 20podat
  • jQuery - 将日期选择器的容器设置为特定的 div

    我在 div 上使用 jQuery UI 日期选择器 div通过移动鼠标隐藏和显示 因为日期选择器存在于末尾标签 不在我的 div 内 当我将鼠标移动到日期选择器时 div 消失 我像这样加载了日期选择器 JavaScript dt1 da
  • 使用其他应用程序打开 pdf

    我正在应用程序中显示 pdf 文件 我想在 nag bar 上显示 打开方式 选项 显示 iPhone 上安装的可以打开相同 pdf 的应用程序 如果用户选择任何应用程序 例如 pdf 查看器 则应该使用 pdf 查看器应用程序打开 pdf
  • WPF 网络浏览器在 Adob​​e 阅读器窗口中打开 PDF 文件

    我正在创建一个 32 位 WPF 应用程序 它需要在 WebBrowser 控件中显示创建的 PDF 在做的同时 WebBrowser Navigate new Url D TestPDF MyDocument pdf 它在 Adob e
  • 响应状态代码并不表示成功:403(禁止 - 用户)Azure Pipeline

    C hostedtoolcache windows dotnet sdk 3 1 416 NuGet targets 128 5 error Response status code does not indicate success 40
  • 我是否需要同时处置 CRM OrganizationServiceProxy 和 OrganizationServiceContext?

    OrganizationServiceProxy 和 OrganizationServiceContext 都支持 dispose 方法 我需要将它们都包装在 using 语句中吗 using var proxy GetOrganizati
  • WPF - 将窗口置于前面

    我有一个 WPF 窗口 我没有关闭它 相反 我执行 Hide 和 Show 它 现在 当我双击记录上网格中的主窗口时 这将触发 Show 窗口 该窗口将始终显示在主窗口后面 我尝试过以下方法 但没有成功 view Show view Act
  • a.equals(a) 什么时候返回 false?

    我想知道在哪些情况下java中的变量不能相等 使用equals 方法 自身 我这里说的不是对象而是变量本身 只要代码编译并在调用 equals 时返回 false 到目前为止 我发现的唯一情况是 public class A public
  • Java/Android 字符串到颜色的转换

    我正在制作一个应用程序 我希望能够通过用户输入 edittext 和十六进制值设置各种颜色 例如 eeeeee等等 问题是我似乎不知道如何转换它们 如果我在代码中做这样的事情 它工作得很好 标题栏 setBackgroundColor 0x
  • Haskell 中的相互递归求值器

    Update 我已经添加一个答案 https stackoverflow com questions 3524485 mutually recursive evaluator in haskell 4504200 4504200这描述了我的
  • SDK管理器不显示示例包选项

    我关注的是安卓安装示例的开发人员链接 http developer android com tools samples index html包裹 但是 当我展开Android平台的包列表时 没有 SDK示例 选项 复选框 可用 为什么 我已
  • C# p/Invoke 如何使用 DirectX 游戏的 SendInput 模拟 keyPRESS 事件

    我经常为各种机器人或其他 GUI 自动化程序模拟键盘按下事件而苦苦挣扎 我已经成功地使用以下方法模拟按键事件 INPUT kInput new INPUT 1 kInput j type SendInputEventType InputKe
  • Elasticsearch 将字符串与模糊字段相匹配

    我正在尝试将字符串与字段匹配 并且只想应用模糊性 例如 对于这些文档 title replace oilfilter title replace motoroil 以下查询应仅匹配第一个文档 Replace oilfilter Replac
  • MKAnnotationView 的不同字体

    在iPhone SDK地图上的标注气泡上 可以更改标题和副标题属性的字体吗 我对标注气泡中显示的默认字体不满意 并且希望使用不同的字体来匹配我的应用程序的其余部分 然而 我没有看到太多提及这一点 这让我担心这可能是不可能的 我见过构建自定义
  • 当用户尝试使用 flutter_inappwebview 在移动应用程序中上传文件时,如何请求用户权限?

    我正在尝试使用 flutter inappwebviewplugin 创建一个 flutter web 应用程序 在应用程序中 我添加了一个用于文件上传的 dropzone 插件 此功能在浏览器和 Android 应用程序上都运行良好 但在
  • 从 C# 应用程序调用 ASP.net Web 服务

    我有个问题 我如何调用 Web 服务并从 C 桌面应用程序获取结果 我正在制作一个桌面应用程序 我希望它能够连接到我的在线 ASP net Web 服务 这怎么可能 在 解决方案资源管理器 中 右键单击项目节点并选择 添加 Service参
  • AWS Fargate - 卷

    我的 docker compose 文件有问题 这是我的 docker 撰写文件 version 3 services nginx proxy image xxxxx dkr ecr xxxxx amazonaws com xxxx lat
  • 如何使用 androidX 不破坏片段

    现在 我尝试 androidX 导航和底部导航栏 当我像下面一样使用它时 supportFragmentManager getSupportFragmentManager navHostFragment NavHostFragment su
  • 将流程添加到 create-react-app 项目的编译步骤

    我正在使用 create react app 开发一个项目 并希望将 Flow 添加到我的流程中 这官方文档 https github com facebookincubator create react app blob master p
  • 布尔实现的atomicCAS

    我想弄清楚是否存在错误答案 https stackoverflow com a 57444538 11248508 现已删除 关于Cuda like的实现atomicCAS for bool是 答案中的代码 重新格式化 static inl

随机推荐

  • 算法题的ACM模式与核心代码模式

    不同的刷题模式 身为一名程序员 刷题网站系统我们应该再熟悉不过了 除了针对竞赛的 OJ 系统 比如 POJ 还有很多专为求职提供的刷题 OJ 系统 比如 leetcode 牛客网 等 这两类 OJ 在刷题模式上有些区别 一般竞赛的 OJ 系
  • Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足

    问题 Windows 照片查看器无法显示此图片 因为计算机上的可用内存可能不足 问题分析 经沟通 打不开的照片都是扫面件 按F11或者使用画图软件可以打开 说明本身是没有问题的 而且一般导致该问题的图片都是照相机拍出来的 那是因为 Wind
  • 一文搞懂考研数列极限问题(概念/计算/证明)史上最强/最全总结

    不管本科高数还是考研数学 数列极限问题 看这一篇文章管够 看完还不会做你来找我 数列极限 是数列和极限两个充满不确定性的概念相混合 容易让人产生摸不着头脑 看到题目就害怕的感觉 本篇文章就按以下目录对这块儿重难点拨云见日 内容循序渐进 越往
  • Java获取Json中的数据

    目录 1 普通元素 2 属性包含大括号 3 属性包含中括号 4 属性中既有中括号包括 又嵌套了大括号 使用com alibaba fastjson解析 总结 一个花括号 放进JSONObject一次 一个中括号 放进JSONArray一次
  • S3fs挂载报错提示

    s3fs挂载报错 提示s3fs unable to access MOUNTPOINT backup fileserver Transport endpoint is not connected s3fs appfiles v1 backu
  • texlive2020安装过程中的问题

    问题 安装TeXstudio后找不到编译文件 运行cmd 添加tex vertion表示找不到该文件 都是因为系统变量名称添加不全导致 打开系统变量名后我发现最后确实添加了c texlive 2021 bin win32这条路径 但是没有写
  • 工具及方法 - 利用在线网站Gravatar创建你的个人Profile

    Gravatar是一个永久免费的网站 不收取任何人的费用 它为个人提供公开的头像和介绍信息 并以供整个网络访问 你的信息和邮箱绑定 Gravatar提供了根据此邮箱即可访问你信息的服务 这样不管你登录到哪个网站来发表评论或进行互动 都可以使
  • 利用OpenCV把一幅彩色图像转换成灰度图

    图像灰度化的目的是为了简化矩阵 提高运算速度 彩色图像中的每个像素颜色由R G B三个分量来决定 而每个分量的取值范围都在0 255之间 这样对计算机来说 彩色图像的一个像素点就会有256 256 256 16777216种颜色的变化范围
  • GuLi商城-前端基础Vue-整合ElementUI快速开发

    npm安装 启动项目 npm run dev http localhost 8082 hello
  • 微信公众号开发中遇到的问题——支付(二)

    第一次开发微信公众号 也是第一次接触微信公众号的支付 我使用的是jssdk 用h5页面调用的支付 后台使用的是java 首先声明 我不是一个愤世嫉俗的人 也不喜欢吐槽 我认为别人提供接口就已经很不错了 干嘛要吐槽呢 但是 这一次 我不得不说
  • kettle报错 Error occurred while trying to connect to the database 三种可能性分析

    如图 报这个错误有以下几种原因 1 电脑没有安装orcal 如果不想安装oracle又想进行oracle远程相关操作 还可以安装oracle运行库 instantclient basic 2 没有将oracle安装路径下的jar包拷贝到ke
  • 使用fastboot工具刷入recovery.img、boot.img、system.img等

    下载解压 fastboot工具 解压FastBoot工具 zip 将解压得到的 FastBoot文件夹复制到任意盘如 D盘 将要刷入手机的recovery img recovery img等放到FastBoot文件夹 安装好手机型号对应的U
  • C++11中std::lock_guard的使用

    互斥类的最重要成员函数是lock 和unlock 在进入临界区时 执行lock 加锁操作 如果这时已经被其它线程锁住 则当前线程在此排队等待 退出临界区时 执行unlock 解锁操作 更好的办法是采用 资源分配时初始化 RAII 方法来加锁
  • 医疗器械安规三项是什么?1、漏电流测试 IEC60950-1 2、电介质强度测试=耐压测试?GB9706 3、保护接地电阻测试=保护接地 ?GB9706

    医疗器械行业标准 并列标准 电磁兼容YY0505 2012 最新生效2023 05 01 YY9706 102 2021 医疗器械安规三项是什么 GB9706 1 2007最新生效GB9706 1 2020 1 漏电流测试 IEC60950
  • 树与二叉树 —— 十分钟吊打数据结构

    目录 传统艺能 树的的概念与结构 基本术语 树的表示 树的实际应用 二叉树 二叉树的性质 传统艺能 小编是双非本科大一菜鸟不赘述 欢迎大佬指点江山 QQ 1319365055 此前博客点我 点我 请搜索博主 知晓天空之蓝 乔乔的gitee代
  • Requirement already satisfied 解决方法

    python m pip install urllib3 upgrade pip 出现 Requirement already satisfied 解决方法 加上路径即可 跟新pip python m pip install target
  • 攻防世界-pwn when_did_you_born(栈覆盖)

    0x01 拿到文件之后 先检查文件的基本信息 文件信息 64bit elf可执行文件 无PIE保护 0x02 执行文件 文件之中有两个输入 第一个输入有回显 0x03 IDA静态分析 可以看出获取flag需要用到v5的值 首先需要v5不等于
  • 召唤神龙小游戏

    文章底部有源码地址 免费获取 游戏介绍 召唤神龙小游戏是一款最近爆火朋友圈的休闲吞噬成长类手机游戏 召唤神龙提供了最轻松的吞噬玩法以及多种不同形态的转换机制 玩家需要从一只小蝌蚪开始游戏 一点点吃东西成长为一条庞大的神龙 在召唤神龙游戏中
  • 深度学习词嵌入和传统机器学习结合

    CNN词嵌入和xgboost结合 在使用小批文本数据进行深度学习时 由于数据量的限制 最终的网络往往过拟合 在验证集上达不到目标结果 传统机器学习算法 例如xgboost 对于小数据量不容易达到过拟合 但是需要对文本进行特征提取 下面的想法
  • python 中的面向对象

    目录 面向对象基础 面向对象 面向过程 面向过程编程 面向对象基本概念 面向对象 类和对象 类 对象 类和对象的关系 类的设计 定义类名 属性和方法的确定 面向对象基本语法 定义简单的类 只包含方法 定义类 self的使用 面向对象基础 面