#编程教育#
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'
上例中,第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++语言那样,在编译期间就能检查出程序错误,只有程序运行之后才能发现错误。