iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python面向对象编程实例分析
  • 733
分享到

Python面向对象编程实例分析

2023-06-29 10:06:18 733人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

本文小编为大家详细介绍“python面向对象编程实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python面向对象编程实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是面向对象编程(类)利用(

本文小编为大家详细介绍“python面向对象编程实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python面向对象编程实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    什么是面向对象编程(类)

    利用(面向)对象的(属性和方法)去进行编码的过程即面向对象编程

    自定义对象数据类型就是面向对象中的类(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 = 180print('\'Jack\'的身高是', jack.top)# >>> 执行结果如下# >>> Neo 的健身项目是'跑步'# >>> 'Jack'的身高是 180print('\'Neo\'的身高是', neo.top)# >>> 执行结果如下:# >>> AttributeError: 'Persion' object has no attribute 'top'

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

    实例化对象可以自定义属性

    每个实例化对象自己定义的属性与其他实例化对象不通用。

    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.eyesdragonLi_legs = dragonLi.legsdragonLi_tail = dragonLi.tailprint(' 猫 ' + 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_01print('狸花猫有两种披毛颜色,一种是:', dragonLi_color_01)# >>> 执行结果如下:# >>> 狸花猫有两种披毛颜色,一种是: 黄棕色dragonLi_color_02 = dragonLi.color_02print('狸花猫有两种披毛颜色,另一种是:', 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()# >>> 执行结果如下:# >>> 1test_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 的特点之一。

    读到这里,这篇“Python面向对象编程实例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网Python频道。

    --结束END--

    本文标题: Python面向对象编程实例分析

    本文链接: https://www.lsjlt.com/news/324307.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Python面向对象编程实例分析
      本文小编为大家详细介绍“Python面向对象编程实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python面向对象编程实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是面向对象编程(类)利用(...
      99+
      2023-06-29
    • Python面向对象编程入门实例分析
      这篇文章主要讲解了“Python面向对象编程入门实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python面向对象编程入门实例分析”吧!一、面向对象和面向过程1.两类软件开发设计方法...
      99+
      2023-07-06
    • C++面向对象编程实例分析
      这篇文章主要介绍“C++面向对象编程实例分析”,在日常操作中,相信很多人在C++面向对象编程实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++面向对象编程实例分析”的疑惑有所帮助!接下来,请跟着小编...
      99+
      2023-06-30
    • Python面向函数转面向对象实例分析
      本文小编为大家详细介绍“Python面向函数转面向对象实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python面向函数转面向对象实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。我们今天有两个目的...
      99+
      2023-06-29
    • Python面向对象入门实例分析
      这篇文章主要介绍“Python面向对象入门实例分析”,在日常操作中,相信很多人在Python面向对象入门实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python面向对象入门实例分析”的疑惑有所帮助!...
      99+
      2023-06-27
    • js面向对象编程的示例分析
      小编给大家分享一下js面向对象编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!//定义Circle类,拥有成员变量r...
      99+
      2024-04-02
    • python函数和面向对象实例分析
      这篇文章主要介绍“python函数和面向对象实例分析”,在日常操作中,相信很多人在python函数和面向对象实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python函数和面向对象实例分析”的疑惑有所...
      99+
      2023-06-29
    • VB面向对象实例化分析
      这篇文章主要介绍“VB面向对象实例化分析”,在日常操作中,相信很多人在VB面向对象实例化分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”VB面向对象实例化分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
      99+
      2023-06-17
    • PHP面向对象编程:案例剖析
      面向对象编程 (oop) 的 php 实战案例:类:一个模板,用于创建包含数据和行为的对象。对象:由类创建的实例,可通过对象上的属性和方法进行访问。购物车案例:使用 oop 创建一个购物...
      99+
      2024-05-10
      php 面向对象编程 php面向对象编程
    • python 面向对象编程
      文章目录 前言如何理解面向对象编程在 python 中如何使用面向对象编程定义类创建对象self添加和获取对象属性添加属性类外添加属性类中添加属性 访问属性类外访问属性类中访问属性 ...
      99+
      2023-08-31
      python 开发语言
    • Python-面向对象编程
      面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板,比如人类、动物类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。 以人类为例,创建一个实例为 xiaomi...
      99+
      2023-01-31
      面向对象 Python
    • Python面向对象编程
        面向对象最重要的概念就是类(Class)和实例(Instance),Java比较熟了,下面贴代码注释   class Student(object): def __init__(self, name, score): ...
      99+
      2023-01-30
      面向对象 Python
    • Python面向对象基础举例分析
      本篇内容主要讲解“Python面向对象基础举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python面向对象基础举例分析”吧!1. 面向对象oop了解# ### oo...
      99+
      2023-06-21
    • Python面向对象中类和对象的示例分析
      这篇文章主要介绍了Python面向对象中类和对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是面向对象编程?我们是不是听过面向过程,拿来放在一起对比就比较好理...
      99+
      2023-06-22
    • Python面向对象编程Day 25部分
      实例化的时候python会自动把实例本身传给self __dict__ 查看属性 类调用的时候不会自动传递参数   s1.tell_info()   School.tell_info(s1) 增 .key=什么;减 del;改 =;查 ....
      99+
      2023-01-30
      面向对象 Python Day
    • Python面向对象编程Day 26部分
      五大数据类型:整型、字符串、列表、元组、字典 多态概念指出了对象如何通过他们共同的属性和动作来操作和访问,而不需考虑他们具体的类、多态表明了动态(又名:运行时)绑定的存在,允许重载及运行时类型确定和验证。多态是继承的改变和扩展的实现机制...
      99+
      2023-01-30
      面向对象 Python Day
    • python面向对象开发的示例分析
      这篇文章主要介绍了python面向对象开发的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因...
      99+
      2023-06-29
    • Python OOP 面向对象编程
      参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封装 指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。 唯一要注意的...
      99+
      2023-01-31
      面向对象 Python OOP
    • Python面向对象编程(一)
      目录一、程序中定义类和对象1、 定义类2、 定义对象二、定制对象独有特征1、引入2、定制对象独有特征3、对象属性查找顺序4、类定义阶段定制属性三、对象的绑定方法1、类使用对象的绑定对...
      99+
      2024-04-02
    • Python面向对象编程(三)
      目录一、isinstance和issubclass二、反射(hasattr和getattr和setattr和delattr)1、反射在类中的使用2、反射在模块中的使用3、实例:基于反...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作