Python(黄金时代)—— python深入使用

深拷贝和浅拷贝

可变类型与不可变类型

  • 可变对象是指,一个对象在不改变其引用的前提下,可以修改其所指向的地址中的值

  • 不可变对象是指,一个对象引用指向的值是不能修改的

浅拷贝

  • 浅拷贝是对于一个对象的顶层拷贝;

  • 简单理解就是,拷贝了引用,并没有拷贝内容

  • 这也就意味着,只要修改其中一个引用的内容,其它引用的地方也都会改变

深拷贝

  • 会拷贝引用指定的值,放入新生成的内存空间中

  • 引用也会重新生成

示例

import copy

# 浅拷贝
a=[1,3]
b=a
a.append(4)

# 引用地址一样,操作其中一个引用添加数据,另一个也会变
print("浅拷贝..............")
print(id(a))
print(id(b))
print(a)
print(b)

# 深拷贝
c=[1,3]
d=copy.deepcopy(c)
c.append(4)

# 引用不一样了,利用其中一个修改了值,另一个不会改变
print("深拷贝..............")
print(id(c))
print(id(d))
print(c)
print(d)

输出结果

总结:不管是浅拷贝还是深拷贝都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别

私有化、import、面向对象 

方法私有化

  • xx:公有变量

  • _x: 单前置下划线,私有化属性或方法,类对象和子类可以访问,但禁止导入

  • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问

  • __xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__

  • xx_:单后置下划线,用于避免与Python关键词冲突

示例

class Test:
    # 初始化方法
    def __init__(self,name,age,sex):
        # 公有变量
        self.name=name
        # 私有化属性
        self._age=age
        # 外部无法直接访问
        self.__sex=sex

    def show(self):
        print(self.name)
        print(self._age)
        print(self.__sex)

test=Test("as",12,"男")
test.show()

import 导入模块

  • import 搜索路径

    • 从下面列出的目录里面依次查找要导入的模块文件

    • '' 表示当前路径

    • 列表中路径的先后顺序代表了 python 解释器在搜索模块时的先后顺序

  • 程序添加路径

    • sys.path.append() 在末尾添加路径

    • sys.path.insert() 在指定位置插入路径

类方法类型

方法包括:实例方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同

  • 实例方法:由对象调用,至少有一个self参数,执行实例方法时,自动将调用该方法的对象赋值给self

  • 类方法:由类调用,至少一个cls参数,执行类方法时,自动将调用该方法的类赋值给cls

  • 静态方法:由类直接调用,可以没有任何参数

  • property方法: 一种与实例方法相似的特殊方法,使用方法如下

    • 定义时,在实例方法上加 @property 注解,并只有 self一个参数

    • 调用时,无需括号

    • property 有三种访问方式,分别对应三个被 @property、@方法名.setter、@方法名.deleter 修饰的方法

示例

class Test:

    age =12

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

    def instance_method(self):
        """实例方法,至少有一个self参数"""
        print("这是实例方法,name值是:",self.name)

    @classmethod
    def class_method(cls,age):
        """类方法,至少有一个cls参数"""
        cls.age=age
        print("这是类方法,age值是:",cls.age)

    @staticmethod
    def static_method():
        """这是静态方法,可以没有任何参数"""
        print("这是静态方法")

    @property
    def count(self):
        """这是property特殊属性"""
        return 11
    @count.setter
    def count(self,value):
        print("property设置值为:",value)
    @count.deleter
    def count(self):
        print("property删除")

test=Test("张三")
#调用实例方法
test.instance_method()

#调用类方法
Test.class_method(22)

# 调用静态方法
Test.static_method()

# 调用property方法
aa=test.count
print(aa)
test.count=44
del test.count

输出结果

property的第二种用法

class Test2:

    def get_count(self):
        return 22

    def set_count(self,value):
        print("设置值:",value)

    def del_count(self):
        print("删除值")

    # property 方法有四个参数
    # 第一个参数是方法名,调用对象.属性 时执行方法
    # 第二个参数是方法名, 调用对象.属性 = XXX 时,执行方法
    # 第三个参数是方法名,调用 del 对象.属性 时,执行方法
    # 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
    cc=property(get_count,set_count,del_count,"ssssssss")

test2=Test2()
c=test2.cc
print(c)
test2.cc=444
del test2.cc
doc=test2.cc.__doc__
print(doc)

输出结果

魔法属性

__doc__  表示类的描述信息

class Tee:
    """ 描述类的信息 ,xxxxxxxxxxxxxxxxxxxxxx"""
    def __init__(self):
        pass

print(Tee.__doc__)

输出结果

__module__ 和 __class__

  • __module__ 表示当前操作的对象在哪个模块

  • __class__ 表示当前操作的对象类是什么

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

dog=Dog("小白")
print(dog.__module__)
print(dog.__class__)

输出结果

__init__

  • 初始化方法:通过类创建对象时,自动触发执行

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

dog=Dog("小白")

__del__

  • 当对象在内存中被释放时,自动触发执行

  • 此方法一般不用定义,程序员在使用时无需关心内存的分配和释放,Python解释器会自动执行,所以 __del__ 的调用是由解释器在进行垃圾回收时自动触发执行

class Dog:
    def __del__(self):
        pass

with与“上下文管理器”

# 普通版,此部分有一个潜在问题,即如果在write时发生异常,则close不会被调用,资源将得不到释放
def t1():
    f=open("aa.txt","w")
    f.write("hello world!")
    f.close()
    
# 升级版本, 此处可以保证发生异常时,资源能得到释放. 但是代码写得比较复杂
def t2():
    f = open("aa.txt", "w")
    try:
        f.write("hello world!")
    except Exception as e:
        print("发生错误!!")
    finally:
        f.close()

# 高级版,此处使用 with的作用和使用 try/finally 语句是一样的,并且写法更简洁
def t3():
    with open("aa.txt", "w") as f:
        f.write("hello world!")

什么是上下文

  • 上下文在不同的地方表示不同的含义,与文章的上下文含义一样。

上下文管理器

  • 任何实现了 __enter__ 和 __exit__ 方法的对象都可以称为上下文管理器,上下文管理器可以使用 with 关键字。文件(file) 对象也实现了上下文管理器

示例

# 自定义一个文件类,作为上下文管理器
class MyFile:
    def __init__(self,filename,mode):
        self.filename=filename
        self.mode=mode

    # 返回资源对象
    def __enter__(self):
        self.f=open(self.filename,self.mode)
        return self.f

    # 处理一些清除工作
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()


with MyFile("aa.txt","w") as f:
    f.write("sssssss")

程序猿与投资生活实录已改名为  程序猿知秋,WX同款,欢迎关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯基础8:BASIC-7试题 特殊的数字

资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 153是一个非常特殊的数,它等于它的每位数字的立方和,即1531*1*15*5*53*3*3。编程求所有满足这种条件…

JavaSE——运算符

目录 一.运算符 二.赋值运算符 三.算术运算符 1.四则运算 2.加法运算 3.除法运算 4.取模运算 5.增量运算符 6.自增自减 四.关系运算符 五.逻辑运算符 1.逻辑与 && 2.逻辑或 || 3.逻辑非 ! 4. 短路求值 六.位运算符 1.按位与& 2.按位…

6款无版权可商用的图片网站

今天给大家分享几个无版权可商用的图片网站,无论是网页设计、还是数字营销、商业海报制作等等都可以非常简单方便的查询到自己想要的图片。 免费可商用图标库 unDraw https://undraw.co/illustrations unDraw是作者Katerina Limpitsouni一手创作的扁平化图标库&…

国内IT软件外包公司汇总(2023 最新版)!

大环境不行,面试太少了,很多本科生想进外包都没机会。非常时期,不需要在意那么多,外包作为过渡也是没问题的,很多外包其实比小公司还要好多了。 也不要太担心去外包会污染自己的简历,只要接触的项目还可以…

电商平台API接口,店铺所有商品

item_search_shop-店铺的所有商品 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥(注册Key和secret接入: https://o0b.cn/anzexi)api_nameString是API接口名称(包括…

动态规划-构造最优二叉树的解路径_20230403

动态规划-最优二叉搜索树的解路径(算法导论) 前言 本文将探索递归的先序和后续对信息表达的影响,通过考察最优二叉搜索树的解roo[i][j]的解,我们可以分析先序和后续遍历之间的互相转换关系,以及为了转换,所付出的空间…

蓝桥杯第23天(Python)(疯狂刷题第6天)

题型: 1.思维题/杂题:数学公式,分析题意,找规律 2.BFS/DFS:广搜(递归实现),深搜(deque实现) 3.简单数论:模,素数(只需要…

下一个系统不是Win12,微软要复活Win10X

先是 Windows 三年发布周期回归又是官方 UI 泄露,再到前不久新增的测试频道… 微软将在2024年推出或许名为 Windows 12 的下一代系统基本已经板上钉钉了。 相比过去,小蝾总觉得即便是换代更新能带来的震撼都越来越少了。 当年每一个版本都是划时代的更…

.net C#反编译及脱壳常用工具--小结

1、Reflector --微软自家工具--推荐 Reflector是最为流行的.Net反编译工具。Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使NET程序员眼前豁然开朗,因为这个免费工具可以将NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转…

【学习笔记、面试准备】机器学习西瓜书要点归纳和课后习题参考答案——第3章

机器学习西瓜书要点归纳第3章 线性模型3.1 基本形式3.2 线性回归3.3 对数几率回归3.4 线性判别分析3.5 多分类学习3.6 类别不平衡问题3.7 阅读材料习题目录地址 第3章 线性模型 3.1 基本形式 线性模型定义: 其中x是输入向量 优点:形式简单&#xff…

C#中的转换

一、什么是转换 将一个类型转换为另外一个类型;可以是两个值类型之间的转换;可以是两个引用类型之间的转换;可以是值类型和引用类型之间的转换(拆箱与装箱);可以用户自定义转换。转换的时候有隐式转换/自动…

lombok快速入门

Lombok是一个实用的Java类库&#xff0c;可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代码。 通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法&#xff0c;并可以自动化生成日志变量&#xff0c;简化java开发、提高效率。 <…

好用到爆的windows文件检索工具--Everything

如果你的电脑是windows系统&#xff0c;那么这款软件强烈推荐大家安装>Everything&#xff0c;他可以帮助你快速的检索的磁盘里的文件&#xff0c;话不多说&#xff0c;开始安装 1.下载 访问https://www.voidtools.com/zh-cn/会跳转官方下载地址 双击安装包运行 效果如下…

Tensor张量基础与常用方法【Pytorch】

Tensor中文译名为张量&#xff0c;标量是零维张量&#xff0c;向量是一维张量&#xff0c;矩阵是二维张量&#xff0c;矩阵的堆叠是三维张量…… 张量的维数可以无穷大&#xff0c;不过由于现实世界是三维的&#xff0c;因此更高维度的图形我们无法想象&#xff0c;但是这并不…

即时通讯-6-已读回执的方案设计

背景-为什么展示已读未读 部分即时通讯软件会选择展示给用户已读未读&#xff0c; 主要是快速感知对方的阅读状态&#xff0c; 感觉到自己受重视&#xff0c; 方便做下一步操作。 如果要带点高度的讲&#xff0c;满足软件所代表的关键用户的诉求 什么场景下要展示已读回执 t…

462. 最小操作次数使数组元素相等 II——【Leetcode每日一题】

462. 最小操作次数使数组元素相等 II 给你一个长度为 n 的整数数组 nums &#xff0c;返回使所有数组元素相等需要的最小操作数。 在一次操作中&#xff0c;你可以使数组中的一个元素加 1 或者减 1 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;2 …

微信小程序获取手机号47001 data format error hint的完美解答(restTemplate发送post请求)

发现问题 这几天正在搞微信小程序获取手机号功能开发&#xff0c;发现发送post请求接口时候&#xff0c;接口返回如下错误&#xff1a; {"errcode": 47001,"errmsg": "data format error hint: [******] rid: ******" } post请求的url为&…

动态代理原理

一、案例分析 1、引出问题 回到Spring之初控制事务繁琐的问题。 回到Spring之初控制事务繁琐的问题. 考虑一个应用场景∶需要对系统中的某些业务方法做事务管理&#xff0c;拿简单的save和update操作举例。没有加上事务控制的代码如下。 加上事务代码&#xff0c;如下&#x…

大数据平台开发——使用Java和Python调用Shell脚本

大数据平台开发——使用Java和Python调用Shell脚本 背景 在大数据平台开发中&#xff0c;经常会遇到需要调用Shell脚本的场景&#xff0c;倒不是说只能用Shell&#xff0c;毕竟大数据开发到头来一定是个语言无关的事情&#xff1a; 从Hive源码解读大数据开发为什么可以脱离S…

Java进阶

注解 什么是注解 Java注解&#xff08;Annotation&#xff09;又称Java标注&#xff0c;是JDK5.0引入的一种注释机制。 Java语言中类、方法、变量、参数和包等都可以被标注。Java标注可以通过反射获取标注内容。在编译器生成类文件时&#xff0c;标注可以被嵌入到字节码中。Ja…