Python之特殊属性、对象的浅拷贝和深拷贝

50 篇文章 ¥19.90 ¥99.00
本文介绍了Python中的特殊属性,包括双下划线开头的属性,并详细探讨了对象的浅拷贝和深拷贝概念,其中浅拷贝只拷贝对象本身而不拷贝子对象,而深拷贝会递归拷贝所有子对象。最后,文章提到了组合在代码复用中的作用,通过将父类对象作为子类属性来实现。

一、特殊属性

Python对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊用法。这里我们列出常见的特殊属性:

特殊属性含义
obj.__dict__对象的属性字典
obj.__class__对象所属的类
class.__bases__表示类的父类(多继承时,多个父类放到一个元组中)
class.__base__类的父类
class.__mro__类层次结构
class.__subclasses__()子类列表
#测试特殊属性
class A:
  pass
​
class B:
  pass
​
class C(B,A):
​
  def __init__(self,nn):
    self.nn = nn
​
  def cc(self):
    print("cc")
​
c = C(3)
​
print(c.__dict__)
print(c.__class__)
print(C.__bases__)
print(C.mro())
print(A.__subclasses__())

 运行结果:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'cc', 'nn']
{'nn': 3}
<class '__main__.C'>
(<class '__main__.B'>, <class '__main__.A'>)
[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
[<class '__main__.C'>]

二、对象的浅拷贝和深拷贝

image-20211116115627056

2.1、浅拷贝

Python拷贝一般都是浅拷贝。

浅拷贝:拷贝时,拷贝源对象,但对象包含的子对象内容不拷贝。

2.2、深拷贝

使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象。

深拷贝:拷贝时,拷贝源对象,也递归拷贝对象中包含的子对象

#测试对象的引用赋值、浅拷贝、深拷贝
import copy
​
class MobilePhone:
  def __init__(self,cpu):
    self.cpu = cpu
​
class CPU:
  pass
​
c = CPU()
m = MobilePhone(c)
​
print("----浅拷贝-------")
m2 = copy.copy(m)  #m2是新拷贝的另一个手机对象
print("m:",id(m))
print("m2:",id(m2))
print("m的cpu:",id(m.cpu))
print("m2的cpu:",id(m2.cpu))  #m2和m拥有了一样的cpu对象
print("----深拷贝--------")
m3 = copy.deepcopy(m)
print("m:",id(m))
print("m3:",id(m3))
print("m的cpu:",id(m.cpu))
print("m3的cpu:",id(m3.cpu))  #m3和m拥有不一样的cpu对象

运算结果:

----浅拷贝-------
m: 1879267229360
m2: 1879267228592
m的cpu: 1879267229648
m2的cpu: 1879267229648
----深拷贝--------
m: 1879267229360
m3: 1879267222256
m的cpu: 1879267229648
m3的cpu: 1879267221968

三、组合

image-20211023171606894

结婚就是组合。两人组合后,可以复用对方的属性和方法!

除了继承,“组合”也能实现代码的复用!“组合”核心是“将父类对象作为子类的属性”。

  1. is-a关系,我们可以使用“继承”。从而实现子类拥有的父类的方法和属性。is-a关系指的是类似这样的关系:狗是动物,dog is animal。狗类就应该继承动物类。
  2. has-a关系,我们可以使用“组合”,也能实现一个类拥有另一个类的方法和属性。has-a关系指的是这样的关系:手机拥有CPU。 MobilePhone has a CPU
#组合测试
​
class MobilePhone:
  def __init__(self,cpu,screen):
    self.cpu = cpu
    self.screen = screen
​
​
class CPU:
​
  def calculate(self):
    print("计算,算个12345")
​
​
class Screen:
  def show(self):
    print("显示一个好看的画面,亮瞎你的钛合金大眼")
​
​
c = CPU()
s = Screen()
m = MobilePhone(c,s)
m.cpu.calculate()    #通过组合,我们也能调用cpu对象的方法。相当于手机对象间接拥有了“cpu的方法”
m.screen.show()

运算结果:

计算,算个12345
显示一个好看的画面,亮瞎你的钛合金大眼
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟之编程

您的支持将成为我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值