iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python面向对象编程之类的进阶
  • 285
分享到

Python面向对象编程之类的进阶

2024-04-02 19:04:59 285人浏览 安东尼

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

摘要

目录1、引用的概念2、对象的拷贝2.1 实例方法的引用2.2 类的特性装饰器3、类的名称修饰3.1 _单下划线开头的名称修饰3.2 _单下划线结尾的名称修饰3.3 __双下划线开头的

1、引用的概念

引用 (Reference)是对象的指针

引用是内存中真实对象的指针,表示为变量名或者内存地址
每个对象存在至少一个引用,id()函数用于获得引用
在传递参数和赋值时,Python传递对象的引用,而不是复制对象

示例代码:


list1 = [1, 2, 3, 4]
list2 = list1
print(id(list1))  # 2044656837192
print(id(list2))  # 2044656837192
# 因为list1是类的实例化,list2引用的是list1,两个都是引用的最基础的object类,所以两个的结果是一样的

Python内部机制对引用的处理

  • 不可变对象:immutable解释器为相同值维护尽量少的内存区域
  • 可变对象:mutable解释器为每个对象维护不同内存区域

示例代码:


text1 = "一碗周"
text2 = text1
text3 = "一碗周"
text4 = "一碗"
text5 = "周"
text6 = text4 + text5
print(id(text1))  # 1616972638288
print(id(text2))  # 1616972638288
print(id(text3))  # 1616972638288
print(id(text4))  # 1616973621272
print(id(text5))  # 1616973578032
print(id(text6))  # 1616974246288

因为text1和2是引用的一个字符串,所以内存地址是一样的;因为Python解释器会大可能的节省内存空间,所以当不可变类型的值一样时,Python会将其自动的引用一个地址空间,来达到节省空间的目的,所以text1/2/3的地址空间是一致的;Python解释器并不会对计算出来的结果来进行地址空间的优化,就算两个的值是一样的,Python解释器也会为新计算出来的结果来开辟一个新的地址空间

示例代码:


list1 = []
list2 = []
list3 = []
print(id(list1))  # 3204114440776
print(id(list2))  # 3204114440840
print(id(list3))  # 3204115873544

每个可变对象都有自己独立的地址空间,并不复用地址空间

导致引用被+1的情况一般都4种

  • 对象被创建
  • 对象被引用
  • 对象被作为函数或方法的参数
  • 对象被作为一个容器中的元素

导致引用-1的情况一把也都4种

  • 对象被删除
  • 对象的名字呗赋予新的对象
  • 对象离开作用域
  • 对象所在容器被删除

2、对象的拷贝

拷贝是复制一个对象为新对象,内存空间有”变化“,拷贝分为浅拷贝和深拷贝

  • 浅拷贝:仅仅复制最顶层对象的拷贝方式,默认拷贝方式
  • 深拷贝:迭代复制所有对象的拷贝方式

示例代码(浅拷贝1)


list1 = ["甜甜", [1, 2, 3]]
list2 = list1.copy()  # 使用copy方法复制
list3 = list1[:]  # 使用切片复制
list4 = list(list1)  # 使用生成列表方式复制
for ch in [list1, list2, list3, list4]:
    for i in ch:
        print(i, id(i),  "\t", end="")  # 打印列表的没一项和id
    print(ch, id(ch))  # 打印每个列表和id
    
'''
---输出结果---
一碗周 2905817180184   [1, 2, 3] 2905787490888   ['一碗周', [1, 2, 3]] 2905787490952
一碗周 2905817180184   [1, 2, 3] 2905787490888   ['一碗周', [1, 2, 3]] 2905817092488
一碗周 2905817180184   [1, 2, 3] 2905787490888   ['一碗周', [1, 2, 3]] 2905817137800
一碗周 2905817180184   [1, 2, 3] 2905787490888   ['一碗周', [1, 2, 3]] 2905817771656
'''

浅拷贝只是拷贝的列表这一层的内存空间,里面的元素的内存空间不会被拷贝

示例代码(浅拷贝2)


list1 = ["一碗周", [1, 2, 3]]
list2 = list1.copy()  # 使用copy方法复制
list3 = list1[:]  # 使用切片复制
list4 = list(list1)  # 使用生成列表方式复制
list4[1].append(4)
print(list1)
print(list2)
print(list3)
print(list4)
'''
--输出结果--
['一碗周', [1, 2, 3, 4]]
['一碗周', [1, 2, 3, 4]]
['一碗周', [1, 2, 3, 4]]
['一碗周', [1, 2, 3, 4]]
'''

这里只对list4进行来数据的修改,但是所有的列表的内容都发生了;这是因为每个列表所引用的内容是一样的,所以修改了1个四个会发生改变

深拷贝要采用copy库里面的deepcopy()方法,迭代拷贝对象内层的各层次对象,完全新开辟内存空间建立对象以及对象下层的各种对象元素,深拷贝仅仅针对可变类别,不可变类型不许创建新对象

示例代码


import copy  # 导入库
list1 = ["一碗周", [1, 2, 3]]
list2 = copy.deepcopy(list1)  # 使用copy库的deepcopy方法复制
for ch in [list1, list2]:
    for i in ch:
        print(i, id(i),  "\t", end="")  # 打印列表的没一项和id
    print(ch, id(ch))  # 打印每个列表和id

'''
---输出结果---
一碗周 2190823984184   [1, 2, 3] 2190853845832   ['一碗周', [1, 2, 3]] 2190853766728
一碗周 2190823984184   [1, 2, 3] 2190853961544   ['一碗周', [1, 2, 3]] 2190853961480
'''

因为“甜甜”字符串属于不可变类型,所以其地址空间不会发生改变,剩下的地址空间都发生了改变

2.1 实例方法的引用

实例方法也是一种引用,就是对象本身的引用,当方法被引用时,方法(即函数)将产生一个对象:方法对象

2.2 类的特性装饰器

@property装饰器可以把方法改变成对外可见的”属性“,在类内部表现为方法,在外边表现为属性

示例代码


class TestClass:
    def __init__(self, name):
        self.name = name

    @property    # 将方法转换为属性
    def age(self):
        return self.__age

    @age.setter  # 为属性进行赋值操作
    def age(self, value):
        if value < 0 or value > 110:
            value = 19
        self.__age = value


tt = TestClass("一碗周")
bb = TestClass("一碗粥")
tt.age = 18
bb.age = -19
print(tt.age)  # 18
print(bb.age)  # 19

3、类的名称修饰

名称修饰 (Name Mangling)是类中名称的转换约定,Python可以通过名称修饰来完成一些重要功能,在Python中采用下划线_来进行名称修饰,分为5种情况,

  • _name
  • name_
  • __name
  • __name__
  • _

3.1 _单下划线开头的名称修饰

  • 单下划线开头属性或者方法为类内部使用的约定,是PEP8规定的一种约定
  • 只是约定,依然可以通过<对象名>.<属性名>方式访问
  • 在功能的上的不同是使用from XX import *时不会导入单下划线开头的属性或者方法

示例代码


class TestClass:
    def __init__(self, name):
        self._name = name  # 约定在内部使用


tt = TestClass("一碗周")
print(tt._name)  # 一碗周

虽然约定在内部使用,但是依然可以被访问

3.2 _单下划线结尾的名称修饰

单下划线结尾的属性或者方法是避免与保留字或已有命名冲突,这也是PEP8规定的,这仅仅是一个约定,没有任何对应的功能

3.3 __双下划线开头的名称修饰

双下划线开头属性或者方法将被解释器修改名称,避免命名冲突,这不是一个约定,而是功能性的, _nama会被修改为_<类名>__name的形式,来实现私有属性、私有方法;这是一种类的名称修饰,间接的来当做私有属性或者私有方法

3.4 __name__双下划线开头和结尾的名称修饰

双下划线开头和结尾的属性或方法没有任何特殊功能,名字不能被修改,部分名称是保留属性或者保留方法

3.5 单下划线

单下划线仅仅是一个无关紧要的名字吗,没有特殊功能

4、Python的最小空类

作用:

类是一个命名空间,最小空类可以当做命名空间使用

  • 最小空类可以辅助存储和使用
  • 动态增加属性是Python类的一个特点

示例代码:


class TestClass:
    pass


a = TestClass
a.text = "一碗周"
print(a.text)  # 一碗周
# 可以动态增加属性来达到存储信息的目的

到此这篇关于Python面向对象编程之类的引用的文章就介绍到这了,更多相关Python类的引用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python面向对象编程之类的进阶

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

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

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

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

下载Word文档
猜你喜欢
  • Python面向对象编程之类的进阶
    目录1、引用的概念2、对象的拷贝2.1 实例方法的引用2.2 类的特性装饰器3、类的名称修饰3.1 _单下划线开头的名称修饰3.2 _单下划线结尾的名称修饰3.3 __双下划线开头的...
    99+
    2024-04-02
  • Python 面向对象进阶
     sys模块 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import sys 4 ''' 5 sys.argv : 在命令行参数是一个空列表,在其他中第一个列表元...
    99+
    2023-01-30
    进阶 面向对象 Python
  • Python面向对象编程之类的封装
    目录1、封装的理解2、私有类属性、公开类属性、私有实例属性和公开实例属性2.1 公开类属性2.2 私有类属性2.3 公开实例属性2.4 私有实例属性2.5 私有属性不一定真的私有3、...
    99+
    2024-04-02
  • Python面向对象进阶及类成员
    再次了解多继承先来一段代码#!/usr/bin/env python# _*_ coding:utf-8 _*_class A:    def bar(self):        print("BAR")        self.f1()c...
    99+
    2023-01-31
    进阶 面向对象 成员
  • Python面向对象编程之类的运算
    目录1、运算概念的理解2、运算符的重载2.1 算术运算符2.2 比较运算符2.3 成员运算2.4 其他运算3、Python类的多态1、运算概念的理解 运算(Operation)是操作...
    99+
    2024-04-02
  • Python面向对象编程之类的继承
    目录1、对继承的理解2、类继承的构建3、Python中最基础的类4、ython类的重载4.1 属性重载4.2 方法重载5、类的多继承1、对继承的理解 继承(Inheritance) ...
    99+
    2024-04-02
  • python 面向对象(进阶篇)
    上一篇《Python 面向对象(初级篇)》文章介绍了面向对象基本知识:面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中)对象,根据模板...
    99+
    2023-01-31
    面向对象 进阶篇 python
  • “PHP面向对象编程进阶指南:掌握面向对象编程思想”
    面向对象编程的基础知识 类: 类是面向对象编程的基本构建块。它定义了对象的属性和方法。 对象: 对象是类的实例。它具有类的所有属性和方法。 方法: 方法是类定义的行为。它可以访问对象的属性,并对它们进行操作。 属性: 属性是类的状态。...
    99+
    2024-02-25
    PHP 面向对象编程 对象 方法 属性
  • Python面向对象编程之类的概念
    目录1、面向对象基本概念1.1 万物皆对象1.2 面向对象编程1.3 面向对象的特征2、Python面向对象的术语3、Python类的构建3.1 类的基本构建 3.2 类的构造函数3...
    99+
    2024-04-02
  • 面向对象进阶
    isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance...
    99+
    2023-01-31
    进阶 面向对象
  • Python基础之面向对象进阶详解
    目录面向对象三大特征介绍继承语法格式查看类的继承层次结构object根类dir()查看对象属性str()方法的重写多重继承MRO()super()获得父类定义多态特殊方法和重载运算符...
    99+
    2024-04-02
  • python3--面向对象的进阶
    昨日内容练习class A:     def func1(self):pass  # func1 普通方法   &nbs...
    99+
    2023-01-30
    进阶 面向对象
  • 【python】面向对象编程之@prop
      @property装饰器作用:把一个方法变成属性调用 使用@property可以实现将类方法转换为只读属性,同时可以自定义setter、getter、deleter方法   @property&@.setter class ...
    99+
    2023-01-31
    面向对象 python prop
  • Python26 面向对象进阶
    静态方法 一个简单的面向对象写法: class Dog(object): def __init__(self,name): self.name = name def eat(self,food): ...
    99+
    2023-01-31
    进阶 面向对象
  • Python面向对象之类和对象
    目录类定义类定义类和属性类中方法对象方法(普通方法)类方法静态方法魔术方法对象创建对象对象属性总结 类 定义类 所有类名首字母要求大写,多个单词时遵循驼峰命名法 所...
    99+
    2024-04-02
  • Python面向对象编程之我见
    面向对象基本概念 面向对象是一种编程范式。范式是指一组方法论。编程范式是一组如何组织代码的方法论。编程范式指的是软件工程中的一种方法学。 一些主流的编程范式: OOP - 面向对象编程 世界观:一切皆对象。 FP - 函数式编程 世...
    99+
    2023-01-31
    我见 面向对象 Python
  • python 面向对象编程
    文章目录 前言如何理解面向对象编程在 python 中如何使用面向对象编程定义类创建对象self添加和获取对象属性添加属性类外添加属性类中添加属性 访问属性类外访问属性类中访问属性 ...
    99+
    2023-08-31
    python 开发语言
  • Python-面向对象编程
    面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板,比如人类、动物类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。 以人类为例,创建一个实例为 xiaomi...
    99+
    2023-01-31
    面向对象 Python
  • python3--面向对象进阶之内置方法
    __str__和__repr__改变对象的字符串显示__str__, __repr__示例class List:     def __init__(self, *args...
    99+
    2023-01-30
    进阶 面向对象 方法
  • Python面向对象编程之怎么理解类的概念
    这篇文章主要讲解了“Python面向对象编程之怎么理解类的概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python面向对象编程之怎么理解类的概念”吧!1、面向对象基本概念1.1 万物皆...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作