当前位置: 首页 > news >正文

深入解析Python面向对象中的属性与方法内存管理

在前面的篇章中,我们曾简要提及Python中的数据属性和函数属性。现在,我们将进一步聚焦于类属性,深入探讨其背后的奥秘。

01数据属性

▍ 类属性的共享机制

数据属性在Python中是所有对象所共享的,这意味着不同实例对象的数据属性在内存中是共享同一份数据的。这可以通过使用id()函数来查看数据属性的内存地址得到验证。

Person类为例,其中定义的country属性就是一个数据属性。当我们创建两个Person实例对象pp2时,尽管它们分别设置了不同的年龄,但它们的country属性却是共享的。通过查看它们的内存地址,我们会发现这两个实例对象的country属性指向的是同一块内存区域。

然而,这并不意味着所有数据属性都必须具有相同的内存地址。实际上,这取决于具体的实现细节和Python解释器的优化策略。尽管如此,数据属性在内存中是共享的,不同实例对象的数据属性可能共享同一内存地址。

▍ 数据对象内存地址的唯一性

每个数据对象在创建后都会被分配一个唯一的内存地址。变量引用的是这个数据对象,实际上是该对象所在内存空间的指针。当我们使用id()函数时,我们获取的是数据对象所在内存空间的地址,而非变量的真实物理地址。

因此,不同实例对象的变量属性的内存地址可能会不同。Python解释器可能会对数据属性的存储方式进行特殊处理,以提升性能或简化内存管理。

02函数属性

▍ 绑定方法的特点

在类中定义的函数被称为方法,它们是类内部的函数。这些方法被绑定给对象使用,通过对象可以调用这些方法。当我们使用obj.method这样的语法时,我们实际上是在获取一个绑定方法,它不同于普通的函数,因为它与特定的对象相关联。

每个绑定方法都有其独特的内存地址,即使我们定义了相同的方法,由于它们被不同的对象所使用,因此它们的内存地址也会有所不同。

▍ 对象实例与方法内存地址

同一个类的不同实例调用相同方法,方法的内存地址会有所不同。这是因为绑定方法与特定对象相关联,因此每调用一次,内存地址也会变化。下面是一个简单的示例:

```python

class Person():

country = '中国'
def \_\_init\_\_(self, name, age):
self.name = name
self.age = age
def eat(self):
print('123456789')

p = Person('python', 28)

p2 = Person('python', 28)

print('p.eat >>>', id(p.eat))

print('p2.eat >>>', id(p2.eat))

```

在这个示例中,我们定义了一个Person类,其中包含一个eat方法。我们创建了两个Person对象pp2,并分别调用了它们的eat方法。由于这两个对象是不同的实例,因此它们各自调用的eat方法也有不同的内存地址。

03私有属性

▍ 私有变量的定义与访问

在Python中,默认情况下,成员函数和成员变量都是公开的。然而,要定义私有变量,只需在变量名前加上"__"两个下划线。例如:

```python

class Person:

country = '中国'
def \_\_init\_\_(self, name, age):
self.\_\_name = name # 这是一个私有变量
self.age = age
def print\_name(self):
print(self.\_\_name)

```

尝试直接访问私有变量,如print('p.eat >>>', p.\_\_name),会报错。这样可以防止意外的外部访问。

▍ name mangling技术

Python中存在一种名为“name mangling”的技术,它会将双下划线前缀的私有变量,如\_\_name,进行特殊处理,实际上将其改写为\_ClassName\_\_name。这意味着,在尝试直接访问这种变量时,Python会将其视为受保护的,不易直接访问的。

然而,若我们确实需要调用这样的属性,可以使用一种特定的语法:即使用一个下划线开头,接着是类名,再后是两个下划线,最后是变量名,例如\_ClassName\_\_name。这样,我们就能绕过name mangling的限制,成功访问到该属性。

虽然在定义时我们使用了双下划线前缀来创建私有变量,但在调用时,需考虑到Python的name mangling技术,以确保能够正确访问这些私有变量。

http://www.jsqmd.com/news/432942/

相关文章:

  • 2026武汉废旧金属回收优质服务商推荐榜 - 资讯焦点
  • 一键开启大模型微调!Unsloth让“炼丹“门槛降到“会点鼠标“级别
  • 基于Simulink的下垂控制在多整流器并联中的应用​
  • 实测2025抗皱面膜TOP5!BFBY美白修护面膜凭什么稳坐第一?干纹斑点全拿捏 - 资讯焦点
  • 2月做题记录
  • 2026氯化钙优质厂家推荐榜 多维度实力解析 - 资讯焦点
  • 2026年3月国内移民中介公司哪个专业靠谱?正规机构推荐飞际移民! - 资讯焦点
  • 榜单发布:2026年春季养老保险规划推荐TOP6,六家机构价值图谱与选购指南 - 资讯焦点
  • 2026年3月泓动数据唯一总部联系方式,如何联系泓动数据咨询 - 资讯焦点
  • 【图像加密】差分扩展的缩略图保持加密技术【含Matlab源码 15118期】
  • DeepSeek V4横空出世!百万Token长文本处理秒杀GPT-5.2?国产芯加持,效率飙升!
  • 境外投资备案代办公司推荐:合规实操与专业代办机构优选 - 资讯焦点
  • 大厂数据资产评估标准化工具:AI架构师揭秘内部自动化评估平台
  • 还在埋头敲代码?2026年,AI大模型正在“淘汰”不会用它的IT人
  • 格式工厂 v
  • 一款使用 C# 编写专为 Windows 11 打造的文件资源管理器增强工具!
  • 灵影助手11
  • 【二分】BISHI89 山峰数组计数
  • 从实验室到产业化:噬菌体展示技术发展与应用全景
  • 手把手教你学Simulink——基于Simulink的PMSM矢量控制(FOC)d=0策略仿真
  • 杆状病毒-昆虫细胞表达系统解析:多角体启动子驱动的超表达与蛋白复合物组装机制
  • Cassandra vs MongoDB:大数据场景下的最佳选择
  • 大数据领域CAP定理的关键要点
  • 从Actor Critic到PPO算法
  • 最小二乘问题详解12:三角化中的非线性优化
  • 数据库事务机制
  • 【第1章·第20节】H无穷控制器MATLAB建模与仿真2——建模与仿真
  • Spring Boot接口防抖秘籍:告别“手抖”,守护数据一致性
  • 新ubuntu服务器常用软件包的安装配置
  • php方案 config.m4编译配置