Python进阶-----面向对象1.0(对象和类的介绍、定义)

2023-11-08

目录

前言:

面向过程和面向对象

类和对象

Python中类的定义

(1)类的定义形式

(2)深层剖析类对象


前言:

      感谢各位的一路陪伴,我学习Python也有一个月了,在这一个月里我收获满满,学到了很多知识,每当我学会了一个新的知识点我会发表一篇博客来表达自己想法和见解,我也写了一篇Python基础学习的专栏(https://blog.csdn.net/m0_73633088/category_12186491.html)  这一阶段的学习也基本告一段落了,而今天我将会开始学习Python中的高级语法,开启Python进阶的新征程,路途漫漫,道路艰险,而我一往无前。

面向过程和面向对象

        编程语言一般分为两种编程范式,一种是面向过程,另一种是面向对象,这两种范式是不相同的语言方法,侧重点是完全不相同的。

面向过程:在前面我们学习的Python基础语法以及C语言,这些都是面向过程的语法,其核心在于过程二字,过程指的是解决问题的步骤,编程的时候先把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按照顺序调用函数,适合简单任务,不需要过多协作。

面向对象:核心就是对象二字, 对象是有属性和方法组成的,编程的时候首先思考的怎么设计这个事物,比如思考造车,我们会思考车怎么设计?,而不是“怎么按照步骤造车的问题”,找轮胎厂制造轮胎,发动机厂制造发动机,发现同时造车的步骤,组成在一起,就完成造车,大大提高了效率。而面向对象即是Python语言的精髓所在。

         那这里就有人会问了:这两种编程范式肯定有高低之分的吧,应该是面向对象比面向过程更加高级。注意力!!!编程范式是没有高低之分的,就好比如文化这一方面,为什么总是有些人崇洋媚外呢?难道中华文化就低人一等了?中国汉服不好看吗?为什么非要去穿和服呢?拜托,中华文化可是有5000年的历史啊,源远流长,博大精深,足以傲视全世界!这里是就是想说明一下编程范式跟文化是一样的实际上没有什么高低之分,只是在不同情况下的适应性不同,千万不要有什么偏见。

类和对象

类:这里就说到类了,好,那什么是类?其实很简单理解,比如说一个物种,或者说某一类人,顾名思义类’是表示某一种事物具有某一共同特征,这就能被分为一类

对象:对象是表示这个类的例子,是具体的实例(具体存在的)

给个例子吧:比如说狗这一类可以分为好多个品种,就以哈士奇和金毛为对象,哈士奇具有什么属性呢?这都不用我说了,二哈名字都摆在那呢;金毛又有什么属性呢?亲人嘛,性格温顺,体贴他人,这些都是这两个对象特有的属性,而它们共有的属性就是:会狗叫、会做坏事、会摇尾巴……等等。很好理解吧!!!

Python中类的定义

前面我们学过字符串的类别是str,整形的类是int、浮点型的类是float……等等,这些都是Python中定义好了的类,我们可以通过这些类去调用类里面的属性和方法,那这里我来教你们怎么去定义类,以及怎么去理解类

(1)类的定义形式

前面我们学过了函数的定义就是def + 函数名字: 下面就是函数体了,其实类也是相似的用关键字class来定义:

#函数的定义
def 函数名(形参):
    函数体
    
函数名(实参)

#类的定义
class 类名:
    类代码(属性,方法)

类的相关规则:

类名的定义:使用大驼峰命名,(所有单词首字母大写)

定义类之后没有实例对象:执行代码,类中代码执行

定义在类中的变量称为属性,函数称为方

示例1:定义和修改类属性 

class Dog:
    name='dog' #在类中的变量是属性(attribute)
    age=5
erha=Dog() #建立实例化对象
print(type(erha))
#输出结果:dog 5
#  <class '__main__.Dog'>

 说明:这里是创建了一个Dog类型,其中有两个属性,name和age,这两个类属性是实例化对象共同拥有的属性,下面我们建立了一个实质化对象erha=Dog() 然后我们就可以输出这个实质化对象的属性,其类型就是Dog 类型,这里还是很好理解的

class Dog:
    name='dog' #在类中的变量是属性(attribute)
    age=5
erha=Dog()
print(erha.name,erha.age)
erha.age=3
erha.name='gou'
print(erha.name,erha.age)
#输出结果:
# dog 5
# gou 3

实例化对象的类属性是可以去修改的,直接赋值修改就OK了 

示例2:定义实例方法

1.写法1

class Dog:
    name='dog'
    age=5
    def fun(self):
        print('这是一直可爱的小狗')
erha=Dog()
print(erha.fun())
#输出结果:这是一直可爱的小狗

2.写法2:,通过类名.方法(实例对象) ---表达

#写法:
class Dog:
    name='dog'
    age=5
    def fun(self):
        print('这只小狗真可爱')
erha=Dog()
print(Dog.fun(erha)) #我们可以直接把实例参数传入到self
#输出结果:这只小狗真可爱

3. 添加位置参数

class Dog:
    name='dog'
    age=5
    def fun(self,name): #定义参数name
        print(f'这是一直可爱的小狗{name}')
erha=Dog()
print(Dog.fun(erha,'happy'))
#输出结果:这是一直可爱的小狗happy

 注意:

这里定义了一个实例方法为fun,那这里有人就会问,这个不就是函数吗?不是的,在Python中定义在类里面的不叫做函数,而是叫做方法,而定义在类以外的才叫做函数,这里要区分开来。

 说明:

这是一个实例方法,在创建的过程中会自动创建一个self参数,这个参数是表示实例对象的本身,当我们创建好了一个对象之后可以去调用这个方法,以上就是这个方法调用的三种写法

示例3:init初始化方法

  • init初始化方法又叫做实例化方法,魔法方法,构造方法

  • 该方法在初始化(实例)对象时会自动调用,通常情况用于初始化对象的属性

  • 该方式在实例化对象时会自动调用,不需要手动调用

class Dog:
    animal='dog'
    def __init__(self,name,age): #name和age是表示实例对象的初始化属性,也是特定属性
        self.name=name  #这里的self.name是自己定义的,而后面的name是参数
        self.age=age
    def fun(self):
        print('这只小狗真可爱')
if __name__=='__main__':
   erha=Dog('Timi',5) #里面的参数必填,否则会报错
   print(erha.animal,erha.name,erha.age)
   print(erha.__dict__) #查看实例对象erha 的特定属性
#输出结果:dog Timi 5
#         {'name': 'Timi', 'age': 5}

init 初始化方法是定义并且初始化实例对象的特点属性,我们可以去通过__dict__去查看,然后返回实例对象属性的键值对。

(2)深层剖析类对象

class Dog:
    name='dog'
    age=5
print(Dog)
erha=Dog()
print(id(erha))#输出获取地址
#输出结果:<class '__main__.Dog'>
#         2931955054960

这里我们可以看出当我们去调用的时候就要加上() ,这个跟函数是一样的,如果不去调用就会跟第一个输出结果一样,输出这个类的类型,例如:print(int) 这个的输出结果就是<class 'int'>,当我们去调用了这个类之后其实就是已经创建了一个实质化对象,这时候计算机会开辟一段内存空间,从id() 函数获取的地址就可以看出

再看一个例子: 

class Dog:
    name='dog'
    age=5
erha=Dog()
print(id(int))
print(id(Dog))
print(id(erha))
#输出结果:140735865654544
#         2504339459136
#         2505947003248

 这里我们可以看出,其实类本身就是有一个空间地址的,而我们去创建一个实例化对象实际上是创建了一个类指针,这个对象erha的类指针指向了Dog 类型,我们可以去通过这个类指针来访问Dog 类型的属性和方法,这也说明了,如果我去定义多个实例对象的话,那么这些实例对象的类指针都会指向定义的类Dog,所以,一个类是具有公用功能的。

class Dog:
    animal='dog'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def fun(self,name):
        print(f'这只{name}真可爱')
    def recurrence(self,age):
        i=1
        sum=1
        while i<=age:
            sum*=i
            i+=1
        return sum
if __name__=='__main__':
    erha=Dog('哈士奇',5)
    Dog.fun(erha,erha.name)
    print(Dog.recurrence(erha,erha.age))

    jinmao=Dog('金毛',4)
    Dog.fun(jinmao,jinmao.name)
    print(Dog.recurrence(jinmao,jinmao.age))
#输出结果:这只哈士奇真可爱
#         120
#         这只金毛真可爱
#         24

这里可以看出我建立了两个实例对象,其中的方法都是共享的,也就说明类指针的强大所在。

好了,这一期就到这里了,谢谢各位~~~

日常分享壁纸~

 

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

Python进阶-----面向对象1.0(对象和类的介绍、定义) 的相关文章

  • AttributeError:'function'对象在pandas中没有属性'bar'

    我有一个 pandas 数据框 它是 pandas 数据框类型 如下所示 type df Out 176 pandas core frame DataFrame 但是 当我尝试在此数据框上使用任何绘图函数 如条形图 时 会出现如下错误 df
  • 使用单个文件的 Python 日志记录(函数名、文件名、行号)

    我正在尝试了解应用程序的工作原理 为此 我将调试命令插入作为每个函数主体的第一行 目的是记录函数的名称以及向日志输出发送消息的行号 代码内 最后 由于这个应用程序由许多文件组成 我想创建一个日志文件 以便我可以更好地理解应用程序的控制流 这
  • 分配列表的多个值

    我很想知道是否有一种 Pythonic 方式将列表中的值分配给元素 为了更清楚 我要求这样的事情 myList 3 5 7 2 a b c d something myList So that a 3 b 5 c 7 d 2 我正在寻找比手
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • 绝对导入不起作用,但相对导入起作用

    这是我的应用程序结构 foodo setup py foodo init py foodo py models py foodo foodo foodo py从导入类models py module from foodo models im
  • 计算熊猫数据帧几个月的总和

    我有一个 pandas 数据框 如下所示 ID Year R1 R1 f KAR1 20201001 1 5 KAR1 20201101 2 6 KAR1 20201201 3 7 KAR1 20210101 4 8 KAR1 202102
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 在 PhotoImage 下调整图像大小

    我需要调整图像大小 但我想避免使用 PIL 因为我无法使其在 OS X 下工作 不要问我为什么 无论如何 因为我对 gif pgm ppm 感到满意 所以 PhotoImage 类对我来说没问题 photoImg PhotoImage fi
  • Python 中 time.sleep 和多线程的问题

    我对 python 中的 time sleep 函数有疑问 我正在运行一个脚本 需要等待另一个程序生成 txt 文件 虽然 这是一台非常旧的机器 所以当我休眠 python 脚本时 我遇到了其他程序不生成文件的问题 除了使用 time sl
  • 当我从本地计算机更改为虚拟主机时,从 python 脚本调用 pdftotext 不起作用

    我编写了一个小的 python 脚本来解析 提取 PDF 中的信息 我在本地机器上测试了它 我有 python 2 6 2 和 pdftotext 版本 0 12 4 我正在尝试在我的虚拟主机服务器 dreamhost 上运行它 它有 py
  • Python sys.modules 包含尚未导入的模块

    我试图了解加载的模块与导入的模块之间的区别 如果有的话 我正在使用 Python 2 7 3 并且只是从命令行运行 Python 如果我执行 import sys sys modules 我得到一个列表 其中包括os 例如 文档说sys m
  • 一个类似 dict 的 Python 类

    我想编写一个自定义类 其行为类似于dict 所以 我继承自dict 不过 我的问题是 我是否需要创建一个私有的dict我的成员 init 方法 我不明白这个有什么意义 因为我已经有了dict如果我只是继承自的行为dict 谁能指出为什么大多
  • Jupyter笔记本突然变得很慢

    我以前在anaconda环境下运行jupyter运行得很好 显示警告后 IOPub data rate exceeded The notebook server will temporarily stop sending output to
  • 预测测试图像时出现错误 - 无法重塑大小数组

    我正在尝试使用 TensorFlow 和 Keras 在 Python 中进行图像识别 并且我已经关注了下面的博客 https stackabuse com image recognition in python with tensorfl
  • 更新 matplotlib 中颜色条的范围

    我想更新一个contourf在函数内绘制 效果很好 然而 数据的范围发生了变化 因此我还必须更新颜色条 这就是我未能做到的地方 请参阅以下最小工作示例 import matplotlib pyplot as plt import numpy
  • 在 for 循环中访问 itertools 产品的元素

    我有一个列表列表 是附加 itertools 产品的一些其他结果的结果 我想要的是能够使用 for 循环访问列表列表中列表的每个元素 但我无法访问所有元素 我只能访问最后一个列表的元素 结果是一个非常巨大的列表列表 例如 1 2 4 3 6
  • 使用 Sphinx 时,如何记录没有文档字符串的成员?

    我正在为我发布的包编写文档 我发现您的文档越全面 人们就越容易找到您的包来使用 废话 实际上 我在充满爱心地编写代码的所有功能和细节方面获得了很多乐趣 然而 我对如何为类级变量编写与 Sphinx 兼容的文档感到完全困惑 特别是 我有一些e
  • 通过新数据更新绘图,而不是在 Jupyter 笔记本中制作新绘图

    我有一些问题 希望你能帮我解决 我需要使用下拉小部件创建交互式绘图 我可以在其中选择并绘制感兴趣的数据 我通过以下方式做到这一点 import plotly graph objects as go import ipywidgets as
  • Python matplotlib:将轴标签/图例从粗体更改为常规粗细

    我正在尝试制作一些出版质量的图 但遇到了一个小问题 默认情况下 matplotlib 轴标签和图例条目的权重似乎比轴刻度线重 是否有办法强制轴标签 图例条目与刻度线的重量相同 import matplotlib pyplot as plt
  • python 日志记录替代方案 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 蟒蛇记录模块 http docs python org library logging html使用起来

随机推荐

  • Proteus元器件介绍

    一直更新 各元器件使用说明 数码管 排阻 resistor network respack 数码管 这个需要主义的就是7SEG COM AN XXX 这里的COM AN是共阳极的意思 下面的COM CAT是共阴极 排阻 resistor n
  • js中宏任务与微任务

    js是一门单线程语言 在执行代码的过程中 程序也分同步任务与异步任务 而异步任务中分为宏任务与微任务 分类 宏任务 ajax setTimeout setInterval DOM监听 UI Rendering等 微任务 Promise的th
  • 基于Qt的收银点餐系统之UI的基本实现(二)

    在上一篇文章中 主要是从宏观上去探讨Qt中UI的实现方案 这一篇文章 将给出具体的代码 实现结果 一 实现思路 上一篇文章讲到 布局工作的特点为 区域划分 层层嵌套 同时整个布局工作中 关键点也在于如何划分区域 如何找到层层嵌套的关系 在这
  • SpringSecurity快速入门和自定义用户名、密码的实现

    SpringSecurity自定义用户名和密码的实现 在SpringBoot项目中导入SpringSecurity依赖 自定义用户名和密码登录的实现 第一种实现方式 配置文件的实现 第二种实现方式 继承WebSecurityConfigur
  • php中_initialize的返回

    php中子类会自动调用父类的 initialize 方法 而不用像 construct 构造方法中 要在子类的构造方法中写明调用父类的构造方法 parent construct 可以将权限验证 生成菜单等每个方法都要使用的操作 放在父类的
  • 企业数字化转型中的能力框架

    首先还是看下对于数字化转型的一个基本定义 我们在这里引用两个定义 一个是百度百科的定义 一个是IDC的定义 先看下百度百科上对数字化转型定义如下 数字化转型 Digital transformation 是建立在数字化转换 Digitiza
  • 【python二级-练习题】

    python江湖 1 求长方形面积 题目描述 代码如下 2 随机密码验证 题目描述 代码如下 3 信息分配表 字典 题目描述 代码如下 4 全模式分词 jieba 题目描述 代码如下 5 数字金字塔 题目描述 代码如下 6 求最大值 最小值
  • GB28181媒体保活机制探究与实现

    规范解读 GB28181 2016和GB28181 2022关于媒体保活机制这块 并无调整 平台 设备媒体流保活机制规定如下 a 链路建立后 码流经过的各级平台应具备媒体流丢失监测能力 若监测到媒体流丢失 应释放该条媒体链路 并通过会话内B
  • tar打包的时候忽略一些目录

    我的个人博客 逐步前行STEP tar打包的时候忽略版本管理文件目录 日志文件目录 storage app目录 tar zcvf web tar gz web exclude vcs exclude storage logs exclude
  • SQL service 数据库 某工厂的物料管理系统数据库设计与实现

    实现物料的分类管理 实现部门和员工信息管理 实现物料的入库和领用管理 实现物料的转仓管理 创建触发器 实现物料入库和领用时相应物料库存的自动更新 创建触发器 实现转仓时转入仓库物料增加 转出仓库物料减少 创建存储过程统计各仓库各种物料的现存
  • docker启动报错:Job for docker. service failed because the control process exited with error code

    1 在使用systemctl start docker时 一直报错 如下图 试了网上的方法 a 修改docker service文件 b 在daemon json中增加代码 都不能解决我遇到的情况 2 经过不懈努力 终于找到办法 在 etc
  • 存量时代下,期货公司如何借助内容实现运营突破

    QuestMobile在 中国移动互联网发展启示录 中披露了一组数据 截止到2021年9月 中国的网民总人数达到11 67亿人 同比仅增加1400万 以上数据表明 流量红利消失殆尽已成为既定的事实 对期货公司来说 流量红利的消失也让其陷入用
  • 电源系列2:LDO 基本 原理(二)

    公众号 工程师看海 后台回复 LDO仿真文件 远山看海 LDO基本原理介绍 一 zhuanlan zhihu com NMOS LDO工作简介 下图是一个NMOS LDO的基本框图 NMOS LDO一般也工作在饱和区 特殊时会在可变电阻区
  • gensim读取已训练模型LDA模型的模型与dictionary

    import pyLDAvis gensim from gensim import models corpora from gensim corpora import Dictionary all data 青绿色 放 几天 塑料袋 里 刺
  • 世界经济论坛区块链报告阅读笔记

    文章目录 世界经济论坛区块链报告阅读笔记 DLT应用落地需要什么 报告案例 Global Payments 报告案例 P C Claims Processing 世界经济论坛区块链报告阅读笔记 该报告主要谈及DLT distributed
  • Android onKeyDown监听返回键无效的解决办法

    文章转载自 https www jb51 net article 115941 htm Android onKeyDown监听返回键无效的解决办法 当我们的Activity继承了TabActivity 在该类中重写onKeyDown是监听不
  • node切换版本

    1 首先卸载node 删除node文件夹 在C Program Files路径下查找 2 安装nvm 下载nvm setup zip文件 进行安装 nvm网址 Releases coreybutler nvm windows GitHub
  • 数据表中常见的数据类型

    数据表中常见的数据类型有 整数类型 浮点数类型 日期与时间类型 字符串类型 二进制类型 布尔类型 整数类型 1int型 表示整型数值 是由四个字节组成的整数 输出范围 2147 2147 数据类型32位 short型 表示短整型 输出范围是
  • 项目_MySQL服务器被入侵,数据丢失,一招教你恢复数据【已恢复】

    已恢复 MySQL服务器被入侵 数据丢失 一招教你恢复数据 0 前言 当时在宝塔安装了MySQL5 7 然后当时只是测试 就直接设置用户名和密码为root 今天在Navicat突然登录不上了 于是在linux下登录MySQL 只剩下一个Re
  • Python进阶-----面向对象1.0(对象和类的介绍、定义)

    目录 前言 面向过程和面向对象 类和对象 Python中类的定义 1 类的定义形式 2 深层剖析类对象 前言 感谢各位的一路陪伴 我学习Python也有一个月了 在这一个月里我收获满满 学到了很多知识 每当我学会了一个新的知识点我会发表一篇