python 类_Python 类属性的动态特点

#编程教育#

Python是一门动态语言,所以它的属性都是在程序运行过程中动态引入的。一个类实例占用的内存大小也是动态变化的。这点和编译性语言是完全不同的。例如C++是一门编译性语言,它在程序运行之前需要经历编译阶段,那么一个类实例的内存大小在编译期间就已经确定下来了,并不会在运行期动态变化。下面我们通过一个简单的例子,来讲解一下python类属性的动态特点。

1. class base:2.     def __init__(self):3.         self.__age = 234.     def setHeight(self, height):5.         self._height = height6.     def getHeight(self):7.         return self._height8. base_instance = base()9. base_instance.setHeight(194)10.base_instance.name = 'hello'
462119ed70875df5798d5cdd1b7b2cb9.png

程序运行到第8行,base类实例内存结构

87937ca2e9a46977c9ec73589048ad56.png

程序运行到第9行,base类实例内存结构

473d60789d5eb95ea16f6313a2879fc5.png

程序运行到第10行,base类实例内存结构

上例中,第8行创建base实例,此时base实例内存中只有self.__age这个属性,并没有其他属性,因为这个属性在类的构造函数__init__定义了,所以在实例生成之时,该属性也就被初始化了,自然也就包含在内存中了。接下来,当运行第9行时,setHeight()函数被调用,self_height属性被初始化,此时base实例内存中才新增加了_height属性。这里__age, _height都是protected属性,因为其属性名称前有下划线。其中__age更特殊一些,它前面有两条下划线,这是python语言实现私有成员的一种方式,针对双下划线的属性,在运行时会被转化成(_className__attributeName)的格式,避免外部通过“.”操作符来直接获取属性值。当程序运行到第10行后,base实例内存中又增加了公有的name属性,这个属性在类定义中并没有,而是在类外部定义的,在类实例生成之后,通过点操作符“.”来给类实例动态添加属性。当然我们并不鼓励最后这种做法,应为它并不符合类封装性的要求。但是从这些特点,我们确实可以看出python作为动态语言的灵活性。

这就是Python作为动态语言的一个特性,它的内存管理更加灵活。当然也有相应的缺点,就是它不能像C++语言那样,在编译期间就能检查出程序错误,只有程序运行之后才能发现错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值