深拷贝和浅拷贝
可变类型与不可变类型
- 可变对象是指,一个对象在不改变其引用的前提下,可以修改其所指向的地址中的值
- 不可变对象是指,一个对象引用指向的值是不能修改的
浅拷贝
- 浅拷贝是对于一个对象的顶层拷贝;
- 简单理解就是,拷贝了引用,并没有拷贝内容
- 这也就意味着,只要修改其中一个引用的内容,其它引用的地方也都会改变
深拷贝
- 会拷贝引用指定的值,放入新生成的内存空间中
- 引用也会重新生成
**示例
**
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")
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
对象
+关注
关注
1文章
38浏览量
17388 -
地址
+关注
关注
1文章
32浏览量
10763 -
引用
+关注
关注
0文章
8浏览量
7730
发布评论请先 登录
相关推荐
为何Python运行效率低?python语言入门
卡,影响运行效率。以上是影响Python运行效率的五大原因,那么该如何进行优化呢?这个就需要您进行下一步的深入了解啦!
发表于 02-01 18:47
Python编程语言可以应用在哪些方面?
领域,Python几乎是霸主地位,将网络一切数据作为资源,通过自动化程序进行有针对性的数据采集以及处理。从事该领域应学习爬虫策略、高性能异步IO、分布式爬虫等,并针对Scrapy框架源码进行深入剖析
发表于 02-05 17:50
学python有哪些方向?
是Python学习的另一方向,网络编程在生活和开发中无处不在,哪里有通讯就有网络,它可以称为是一切开发的“基石”。对于所有编程开发人员必须要知其然并知其所以然,所以网络部分将从协议、封包、解包等底层进行深入剖析
发表于 03-09 15:47
Python十大应用领域和就业方向
领域,Python几乎是霸主地位,将网络一切数据作为资源,通过自动化程序进行有针对性的数据采集以及处理。从事该领域应学习爬虫策略、高性能异步IO、分布式爬虫等,并针对Scrapy框架源码进行深入剖析
发表于 11-21 14:54
Python解释器的基本结构
供足够的上下文来进一步研究它。我们的目标并不是解释所有关于解释器的知识——就像编程和计算机科学中许多有趣的领域一样,您可以花费数年时间来深入理解这个主题。Byterun它的结构类似于Python的主要实...
发表于 09-16 06:42
Python编程实用指南
Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。通过 Python 编程,我们能够解决现实生活中的很多任务。本书是一本面向实践的 Python 编程实用指南。本书的目的,不仅是
发表于 09-27 06:21
深入Python3中文版PDF电子书免费下载
如果使用的是托管服务器上的帐号, ISP[互联网供应商] 可能已经安装了 Python 3 。如果是在家运行的 Linux ,也可能已经安装了 Python 3 。多数流行的 GNU/Linux
发表于 06-10 08:00
•0次下载
python的优缺点有哪些
Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以胜任那些非常非常复杂的应用程序开发。
深入探讨Python 的简要历史和优点
Scarlett 指出,作为一种通用语言,Python 可以用于各种应用程序,“简单易用” 的特点也使得它成为用于自动化任务、构建网站或软件和分析数据的不错的选择。
发表于 03-15 11:38
•297次阅读
python写完程序之后怎么运行
对Python程序的执行流程有更深入的了解。 一、Python程序的基本结构 Python程序是由一系列的语句构成,语句是指一行代码或多行代码组成的指令集合。一个
使用Python进行自然语言处理
在探讨使用Python进行自然语言处理(NLP)的广阔领域时,我们首先需要理解NLP的基本概念、其重要性、Python在NLP中的优势,以及如何通过Python实现一些基础的NLP任务。本文将从这些方面展开,并
Python在AI中的应用实例
Python在人工智能(AI)领域的应用极为广泛且深入,从基础的数据处理、模型训练到高级的应用部署,Python都扮演着至关重要的角色。以下将详细探讨Python在AI中的几个关键应用
评论