iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python学习之面向对象编程详解
  • 284
分享到

Python学习之面向对象编程详解

2024-04-02 19:04:59 284人浏览 八月长安

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

摘要

目录什么是面向对象编程(类)类的关键字 - class类的定义与使用类的参数 - selfself 的解析与总结类的构造函数构造函数的创建方法关于对象的生命周期什么是面向对象编程(类

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

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

自定义对象数据类型就是面向对象中的类(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 的特点之一。

以上就是Python学习之面向对象编程详解的详细内容,更多关于Python面向对象编程的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python学习之面向对象编程详解

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

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

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

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

下载Word文档
猜你喜欢
  • Python学习之面向对象编程详解
    目录什么是面向对象编程(类)类的关键字 - class类的定义与使用类的参数 - selfself 的解析与总结类的构造函数构造函数的创建方法关于对象的生命周期什么是面向对象编程(类...
    99+
    2022-11-13
  • Python学习之面向函数转面向对象详解
    还记得前文函数章节的‘函数的定义与使用’章节么?今天我们就来针对 类 进行一个综合练习,利用所学的面向对象编程、类 的知识将我们之前做的面向函数编写的学生信息...
    99+
    2022-11-13
  • Java学习笔记之面向对象编程精解
    目录包继承super 关键字finalprotected关键字组合多态抽象类接口面向对象编程(包、继承、组合、多态 、抽象类、接口) 包 包其实就是类的集合,其本质上其实就是一个文件...
    99+
    2022-11-12
  • Python 3 学习笔记:面向对象编程
    概述 面向对象编程(Object Oriented Programming,即 OOP),是一种程序设计思想,比面向过程编程更加灵活,更易扩展。 Python 在设计的时候就是按照面向对象编程的思想设计的,像我们前面学过的各种数据类型,如字...
    99+
    2023-01-31
    面向对象 学习笔记 Python
  • Python 面向对象编程详解
    Python 面向对象 方法没有重载# 在其他语言中,可以定义多个重名的方法,只要保证方法签名唯一即可。方法签名包含3个部分:方法名、参数数量、参数类型。 Python 中,方法的的...
    99+
    2022-12-30
    python面向对象程序设计 python面向对象的三个基本特征 python面向对象编程简单例子
  • Python - 面向对象学习
    本节内容: 面向对象编程介绍为什么要用面向对象进行开发?面向对象的特性:封装、继承、多态类、方法、  引子你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是...
    99+
    2023-01-31
    面向对象 Python
  • Python学习教程:面向对象学习实力讲解
    类的实现class Cat:"""猫科动物类"""tag='我是家猫 'def __init__ (self,name,age=0): #没有默认值必须要传,且写在...
    99+
    2023-06-02
  • Scala 学习之面向对象(3)
    ==> 类        ---> 类的定义class Student{     // 定义属性     private var stuName:String = "Tom"     private vat stuAge:Int...
    99+
    2023-01-31
    面向对象 Scala
  • Python的面向对象编程方式学习笔记
    类与实例 类与实例相互关联着:类是对象的定义,而实例是“真正的实物”,它存放了类中所定义的对象的具体信息。 下面的示例展示了如何创建一个类: class MyNewObjectType(bases): ...
    99+
    2022-06-04
    面向对象 学习笔记 方式
  • 学习python的第十八天(面向对象编程
    一.面向对象编程 ​ 面向过程编程,核心是编程二字,过程指的是解决问题的步骤,即先干什么、后干什么、再干什么、然后干什么…… 与工厂的工艺流程差不多,前后都有影响 优点:复杂的问题流程化,进而简单化,调理清晰. 缺点:拓展性不行 二.对...
    99+
    2023-01-31
    面向对象 python
  • C++面向对象编程之析构详解
    目录1. 概述2. 详论2.1. 对象生命周期2.2. 不一定需要显式析构2.3. 析构的必要性3. 总结1. 概述 类的析构函数执行与构造函数相反的操作,当对象结束其生命周期,程序...
    99+
    2022-11-13
  • 详解Java面向对象编程之多态
    目录Java面向对象编程之多态一.对于多态的理解:二.多态的实现方法总结Java面向对象编程之多态 一.对于多态的理解: 通俗点理解,多态其实就是一词多义,就是一种方法的多种状态,即...
    99+
    2022-11-12
  • 【python】面向对象编程之@prop
      @property装饰器作用:把一个方法变成属性调用 使用@property可以实现将类方法转换为只读属性,同时可以自定义setter、getter、deleter方法   @property&@.setter class ...
    99+
    2023-01-31
    面向对象 python prop
  • Python面向对象编程之区间的插入详解
    目录一、面向对象编程的Python实例描述二、面向对象编程的Python实例的示例三、面向对象编程的Python实例的编写过程3.1 本文的集成编译环境3.2 编写Interval类...
    99+
    2022-11-11
  • python学习之面向对象程序设计的一些
    将属于一类的对象放在一起:     如果一个函数操纵一个全局变量,那么两者最好都在类内作为特性和方法实现。    不要让对象过于亲密:     方法应该只关心自己实例的特性,让其他实例管理自己的状态。 简单就好:     让方法小巧起来,...
    99+
    2023-01-30
    程序设计 面向对象 python
  • python学习之面向对象【入门初级篇】
    前言 最近在学习Python的面向对象编程,以前是没有接触过其它的面向对象编程的语言,因此学习这一部分是相当带劲的,这里也总结一下。 概述 python支持多种编程范式:面向过程、面向对象、面向切面(...
    99+
    2022-06-04
    面向对象 入门 python
  • Python学习 :面向对象 -- 三大
    面向对象的三大特性 一、封装 把数据、值、变量放入到对象中 构造方法 _init_方法 特殊作用: 在 obj = 类名() 执行时: 内部自动执行两个步骤: 1、创建对象 2、通过对象执行类中的一个特殊方法(_init_方法) ...
    99+
    2023-01-30
    三大 面向对象 Python
  • python学习32(面向对象_3)
    继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。即一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生...
    99+
    2023-01-31
    面向对象 python
  • Python面向对象之模块详解
    目录1.1 导入模块1.1.1 import 模块名1.1.2 from 模块名 import 功能名1.1.3 from …import*1.1.4 as 定义别名1.2 制作模块...
    99+
    2022-11-12
  • Python面向对象编程之我见
    面向对象基本概念 面向对象是一种编程范式。范式是指一组方法论。编程范式是一组如何组织代码的方法论。编程范式指的是软件工程中的一种方法学。 一些主流的编程范式: OOP - 面向对象编程 世界观:一切皆对象。 FP - 函数式编程 世...
    99+
    2023-01-31
    我见 面向对象 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作