irpas技术客

〖Python零基础入门篇?〗- 五分钟快速带你了解什么是面向对象编程_全栈哈士奇

网络投稿 3866

万叶集🎉 隐约雷鸣,阴霾天空。 🎉🎉 但盼风雨来,能留你在此。 🎉

前言: ? 作者简介:渴望力量的哈士奇 ?,大家可以叫我 🐶哈士奇🐶 ,一位致力于 TFS 赋能的博主 ? 🏆 CSDN博客专家认证、新星计划第三季全栈赛道 top_1 、华为云享专家、阿里云专家博主 🏆 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬 🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦


专栏系列(点击解锁)学习路线指引知识定位 🔥Python全栈白皮书🔥 零基础入门篇 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。 语法进阶篇 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。 自动化办公篇 实现日常办公软件的自动化操作,节省时间、提高办公效率。 自动化测试实战篇 从实战的角度出发,先人一步,快速转型测试开发工程师。 数据库开发实战篇 更新中 爬虫入门与实战 更新中 数据分析篇 更新中 前端入门+flask 全栈篇 更新中 django+vue全栈篇 更新中 拓展-人工智能入门 更新中 网络安全之路 踩坑篇 记录学习及演练过程中遇到的坑,便于后来居上者 网安知识扫盲篇 三天打鱼,不深入了解原理,只会让你成为脚本小子。 vulhub靶场漏洞复现 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。 shell编程篇 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结] WEB漏洞攻防篇 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 渗透工具使用集锦 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 点点点工程师 测试神器 - Charles 软件测试数据包抓包分析神器 测试神器 - Fiddler 一文学会 fiddle ,学不会倒立吃翔,稀得! 测试神器 - Jmeter 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。 RobotFrameWork Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。 Java实现UI自动化 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。 MonkeyRunner 该工具目前的应用场景已不多,文档已删,为了排版好看才留着。


文章目录 什么是面向对象编程(类)类的关键字 - class类的定义与使用类的参数 - self如何理解 self 参数类比重点 self 的解析与总结属性方法小结 类的构造函数构造函数的创建方法 关于对象的生命周期

什么是面向对象编程(类) 利用(面向)对象的(属性和方法)去进行编码的过程即面向对象编程自定义对象数据类型就是面向对象中的类(class)的概念 类的关键字 - class

class 关键字用来声明类,类的名称首字母大写,多单词的情况下每个单词首字母大写(即驼峰命名法)。在我们一开始学习 Python 的时候说过,要尽量避免使用 驼峰命名法 ,但 类 的命名是一个特例,类 的命名可以使用驼峰命名。

类的定义与使用

类的定义示例如下:

class Nmae(object): # class关键字 + 类名(首字母大写) + 小括号(括号内填写 object:为python中的通用对象,书写通用对象的 class 会带有更多的内置功能) + 冒号 变量 = 变量的值 # 可以定义 类 的变量 def func(self): do # 也可以定义 类 的函数:类函数内有个必传参数 'self' ,一定要书写在类函数的第一参数位,这是 python 内部的语法规定 # 需要注意的是 类的属性与函数的缩进要统一

类的使用示例如下:

# 定义一个动物类;动物类中定义一个变量;定义一个 跑 的函数(属性) class Animal(object): # 定义一个类 name = '哈士奇' # 类变量(类属性) def run(self): # 类函数:将 self 作为第一个参数传入 类函数 'run()' print(f'{self.name} can run') # 'self.name'为类属性,如果不加上'self.'则不会找到类属性;如果想要在类函数中调用类属性就必须加上'self.' # 'self' 参数具备两个功能 # 1.可以帮助我们调用类属性 # 2.将使用 self 的函数调用到类中,如果我们有另一个函数,可以在另一个函数中通过 'self.' 来进行调用 run 函数 dog = Animal() # 类的实例化 print(dog.name) # 通过实例化进行属性调用 dog.run() # 通过实例化,进行函数调用 # >>> 执行结果如下: # >>> 哈士奇 # >>> 哈士奇 can run 类的参数 - self

在类里面,所有实例方法都需要加 self 参数,且排在第一个,有且仅有一个。

self 参数的含义 :在类中定义的方法,第一个参数 self 指向调用该方法的实例对象,在方法中通过 self.属性 这样的形式访问对象的实例属性

self 是 类函数 中的必传参数,且必须放在第一个参数位置self 是一个对象,它代表着实例化的变量自身self 可以直接通过点(.)来定义一个类变量 如 self.name = Neo ,如果在函数体内定义变量可以通过 self + . +变量名 来进行赋值。self 中的变量与含有 self参数的函数可以在类中的任何一个函数内随意调用非函数中定义的变量在定时的时候不需要使用 self 如何理解 self 参数 类比 如果把 类 比作造房子的图纸类实例化 后的对象是真正可以住的房子根据一张图纸(类),可以设计出成千上万的房子(实例对象)每个房子长相都是类似的(都有相同的实例属性和实例方法),但它们都有各自的主人如何区分不同的房子:通过 self 参数,可以保证每个房子的主任仅能进入自己的房子(每个实例对象只能调用自己的实例属性和实例方法) 重点 一个类可以产生多个实例对象,当某个实例对象调用实例方法,该对象会把自身的引用作为第一个参数自动传递给该方法换句话说:Python 会自动将实例方法的第一个参数指向调用该方法的对象这样,Python 解释器就知道到底要执行哪个对象的实例方法了调用实例方法的时候,不需要手动为第一个参数传值

可能大家还不是很理解,根据类的两个关键要素属性和方法,具体来使用self看看实际应用效果:

class Persion(object): name = None age = None def run(self): print(f'{self.name} 的健身项目是\'跑步\'') def swim(self): print(f'{self.name} 的健身项目是\'游泳\'') neo = Persion() neo.name = 'Neo' neo.run() # >>> 执行结果如下: # >>> Neo 的健身项目是'跑步'

我们再重新实例化一个对象,看看这个新的实例化对象是否同步了 neo.name

class Persion(object): name = None age = None def run(self): print(f'{self.name} 的健身项目是\'跑步\'') def swim(self): print(f'{self.name} 的健身项目是\'游泳\'') neo = Persion() neo.name = 'Neo' neo.run() jack = Persion() jack.run() # >>> 执行结果如下: # >>> Neo 的健身项目是'跑步' # >>> None 的健身项目是'跑步'

从输出结果可以看到 我们修改的 neo 实例化对象的对应的 name 的值仅作用于自己的实例,而 Persion 类,与新的 jack 实例化对象并没有受到影响。

所以即使使用新的对象进行实例化,还是需要新的实例化对象来修改类的属性,来达到我们自己想要的效果。其实很好理解,都是人类,但是每个人的个体化都是不同的。所以他们拥有人类的共同属性后 (name,age) ,也可以自定义自己的属性。

现在我们的 Persion 类 定义了两个属性 'name' 与 'age' ,如果我们再添加一个属性呢? ,其实是可以的。现在我们针对 'Jack' 增加一个自定义属性 ,尝试一下。

class Persion(object): name = None age = None def run(self): print(f'{self.name} 的健身项目是\'跑步\'') def swim(self): print(f'{self.name} 的健身项目是\'游泳\'') neo = Persion() neo.name = 'Neo' neo.run() jack = Persion() jack.top = 180 print('\'Jack\'的身高是', jack.top) # >>> 执行结果如下 # >>> Neo 的健身项目是'跑步' # >>> 'Jack'的身高是 180 print('\'Neo\'的身高是', neo.top) # >>> 执行结果如下: # >>> AttributeError: 'Persion' object has no attribute 'top'

从上面的 jack.top 与 neo.top 的自定义属性,我们发现三件事。

1.实例化对象可以自定义属性2.每个实例化对象自己定义的属性与其他实例化对象不通用。3.Persion类在实例化对象之后,依然只有自己的两个属性 (name 和 age) ,实例化对象自定义的属性仅作用于自己,并不影响 类 。 self 的解析与总结

说实话,关于 Python 中的 self 我一开始接触的时候,也是给我搞的云里雾绕、五迷三道的…这里做个总结,希望对同样云里雾绕、五迷三道的童鞋有所帮助。

Python 中 self 代表的是 类的示例 ; self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。Python 中 self 只有在针对 类 的情况下,才是有意义的。self 只能用在 python 类 的方法中。

具体的举例说明如下:

属性 关于属性 - 1:如果变量定义在类下面而不是类的方法下面,那这个变量既是类的属性也是类实例的属性。 class Cat(object): eyes = '有2只眼睛' legs = '有4条腿' tail = '有1只尾巴' dragonLi = Cat() dragonLi.name = '狸花猫' dragonLi_eyes = dragonLi.eyes dragonLi_legs = dragonLi.legs dragonLi_tail = dragonLi.tail print(' 猫 ' + Cat.eyes, Cat.legs, Cat.tail) print(dragonLi.name, dragonLi_eyes, dragonLi_legs, dragonLi_tail) # >>> 执行结果如下: # >>> 猫 有2只眼睛 有4条腿 有1只尾巴 # >>> 狸花猫 有2只眼睛 有4条腿 有1只尾巴 关于属性 - 2:如果变量定义在类的方法下面,如果加了self,那这个变量就是类实例的属性,不是类的属性;如果没有加self,这个变量只是这个方法的局部变量,既不是类的属性也不是类实例的属性。 class Cat(object): eyes = '有2只眼睛' legs = '有4条腿' tail = '有1只尾巴' def __init__(self): # 关于__init__() 会在下面的 '类的构造器'有详细讲解 self.color_01 = '黄棕色' color_02 = '黑棕色' dragonLi = Cat() dragonLi_color_01 = dragonLi.color_01 print('狸花猫有两种披毛颜色,一种是:', dragonLi_color_01) # >>> 执行结果如下: # >>> 狸花猫有两种披毛颜色,一种是: 黄棕色 dragonLi_color_02 = dragonLi.color_02 print('狸花猫有两种披毛颜色,另一种是:', dragonLi_color_02) # >>> 执行结果如下: # >>> AttributeError: 'Cat' object has no attribute 'color_02'. 方法

关于方法1:如果在类中定义函数时加了self,那这个函数是类实例的方法,而不是类的方法。

class Cat(object): def eat(self): print('爱吃鱼') dragonLi = Cat() dragonLi.eat() # >>> 执行结果如下: # >>> 爱吃鱼 Cat.cat() # >>> 执行结果如下: # >>> TypeError: Cat.eat() missing 1 required positional argument: 'self'

关于方法2:如果在类中定义函数时候没有加self,那这个函数就只是类的方法,而不是类实例的方法。

class Cat(object): def eat(): print('爱吃鱼') Cat.eat() # >>> 执行结果如下: # >>> 爱吃鱼 dragonLi = Cat() dragonLi.eat() # >>> 执行结果如下: # >>> TypeError: Cat.eat() takes 0 positional arguments but 1 was given 小结

属性:

如果变量定义在类下面而不是类的方法下面,那这个变量既是类的属性也是类实例的属性。如果变量定义在类的方法下面,如果加了self,那这个变量就是类实例的属性,不是类的属性;如果没有加self,这个变量只是这个方法的局部变量,既不是类的属性也不是类实例的属性。

方法:

如果在类中定义函数时加了self,那这个函数是类实例的方法,而不是类的方法。如果在类中定义函数时候没有加self,那这个函数就只是类的方法,而不是类实例的方法。 类的构造函数

前面我们了解了 类的创建、类的属性、类函数的使用方法,现在我们再来看看类的构造函数。

什么是类的构造函数? —> 构造函数是类中的一种默认函数,通过定义它可以在 类实例化 的同时,将参数传入类中。(类似于函数执行的时候可以传一些参数)

构造函数的创建方法

重点:构造函数依然要在 类 中定义

def __init__(self, a, b) # def关键字 + __init__ + 小括号(括号内第一个传入的依然是 self ,后面再跟上希望实例化时传入的参数) self.a = a # 在构造函数里,将参数绑定在 self 中,将变量通过 self 绑定之后,就可以在类的各个函数中进行调用了 self.b = b

构造函数的用法,示例如下:

class Test(object): def __init__(self, a): # __init__ 构造函数一定要写在第一个,这是一个很好的编程规范 self.a = a def run(self): print(self.a) test = Test(1) test.run() # >>> 执行结果如下: # >>> 1 test_02 = Test('Hello') test_02.run() # >>> 执行结果如下: # >>> Hello

接下来我们再使用 构造函数 针对前面我们创建的 Cat 类进行修改

class Cat(object): def __init__(self, eyes, legs, tail, color='黄棕色'): self.eyes = eyes self.legs = legs self.tail = tail self.color = color def show_cat(self): self.work = '抓老鼠' print('猫的通用属性为', self.eyes, self.legs, self.tail) dragonLi = Cat('2只眼睛', '4条腿', '1只尾巴') dragonLi.show_cat() # >>> 执行结果如下: # >>> 猫的通用属性为 2只眼睛 4条腿 1只尾巴 黄棕色 dragonLi.name = '狸花猫' dragonLi.color = '虎斑色' print(dragonLi.name, dragonLi.eyes, dragonLi.legs, dragonLi.tail, dragonLi.color, dragonLi.work) # >>> 执行结果如下: # >>> 狸花猫 2只眼睛 4条腿 1只尾巴 虎斑色 抓老鼠 关于对象的生命周期

注意:这里说的对象的生命周期,指的是实例化的对象。

之前我们提到过,当一个变量不使用的时候就会被内存管家清理掉。 接下来我们就来看看一个变量的一生,从出现到消亡的过程。之所以在这里插上这一章节介绍 对象的生命周期 ,也是为了更好的理解对象, 从而更好的使用他们。

我们之前学习的 深拷贝与浅拷贝, 浅拷贝是创建一个新的内存地址, 而深拷贝是使用之前已经定好的变量。

通过对一个对象的生命周期的理解, 可以让我们权衡是终结一个对象还是继续使用它们。


我们通过构造函数完成一个对象的实例化,这个时候一个对象的生命周期就开始了,在这个时候内存管家发现有一个对象的加入就会为这个实例化的对象分配一个内存地址(也就是实例化对象在内存中的家)。

接下里我们就可以操作这个对象,可以调用它的内置函数还有功能。当我们不使用这个对象的时候,一般有两种情况;

第一种是这个内存块中的值没有变量与之绑定了,比如当我们的一个变量的默认值被一个函数调用后变量有了新的值,这个时候变量原有的默认值与变量不再是赋值关系了。

第二种是当我们执行完了所有的程序,也就是代码已经执行到了最后一行。 Python 解释器发现已经处理完了所有的业务,这个时候脚本就会停止处理并释放脚本中所有的对象,释放所有的对象其实就是告知内存管家,内存管家就会自动处理这些对象的内存地址。

以上两种情况的统一表现形态都是不再使用这些对象,这个时候每个对象中自带的内置函数 __del__ (两个下划线)就会被调用,通知内存管家从内存中释放每个对象对应的内存块。这就是整个对象的生命周期。

无论是字符串、数字、列表、元组、字典、集合,甚至布尔类型与空类型,我们知道 Python 中一切皆是对象,所以它们也是按照这个规律存在于消亡。

Python 中的内存管理都是自动去完成的,所以我们并不需要特意的去对它进行专门的处理。

关于 __del__ 函数并不需要我们书写和定义,当我们实例化一个对象之后,它就会默认存在,并拥有自动通知内存管家清理内存的功能。这也是 Python 的特点之一。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Python零基础入门篇 #什么是面向对象编程