结合代码论述Python的动态执行特性
U201110678
张永钰
摘要:Python是一种动态解释型语言,本文主要研究其动态特性。本文通过结合代码实例,通过分析Python语言的变量动态特性、Python脚本动态执行过程以及类与模块中的动态特性,详细展现了Python语言的动态执行特性。 关键词:Python、动态特性 一、python的动态
python是一门动态解释型语言,本文主要研究其动态特性。
所谓动态是什么呢?其实就是当且仅当程序运行时才能知道对象的类型。 def func(arg):
print(\if __name__ == '__main__': func('.')
例如上面的func函数,arg是什么定义类型的,会传入什么样的参数程序(在func函数的作用域内)一无所知。但是,参数一旦传入,程序能通过参数来找到参数对应的类型,从而判断能否进行print操作。那么,对象本身必须包含对应的类型信息(以下称元信息)。 动态类型以及由它提供的多态性,这个概念无疑是Python语言的简洁性和灵活性的基础。 在Python中,并不会声明脚本中使用的对象的确切的类型。事实上,程序甚至可以不在意特定的类型;相反地,它们能够自然地适用于更广泛的场景下,因为动态类型是Python语言灵活性的根源。
二、Python中的动态变量
在Python中,并不会声明中使用的对象的确切的类型。事实上,程序甚至可以不在意特定的类型;相反地,它们能够自然地适用于更广泛的场景下,因此动态类型是Python语言灵活性的根源。 1)变量创建
一个变量,例如a,当代码第一次给它赋值时就被创建了,之后的赋值将会改变已创建的变量名的值。从技术上来讲,python在代码运行之前先检测变量名,可以当成是最初的赋值创建变量 2)变量类型
变量用于不会有任何和它关联的类型信息或约束。类型的概念是存在于对象中而不是变量中。变量原本是通用的,她只是在一个特定的时间点,简单地引用了一个特定的对象而已 3)变量使用
当变量出现在表达式中时,它会马上被当成引用的对象所代替,无论这个对象是什么类型,此外,所有的变量必须在其使用前明确地赋值,使用未赋值的变量会产生错误。 从概念上来说,python会执行三个不同的步骤去完成这个请求: 1. 创建一个对象代表值3
2. 创建一个变量a,如果它还没有创建的话
3. 将变量与新的对象3连接(引用,指针指向)
如图.1 所示的是一个在python中的内部结构。变量和对象保存在内存的不同部门,并通过连接相关联。变量总是连接到对象,并且绝不会连接到其他的变量上,但大部分的对象可以连接到其他的对象(例如:一个列表对象能够连接到它所包含的对象)
图1
如图.1:变量名和对象,在运行a=3后,变量a变成对象3的引用,在内部,变量事实上是到对象内存空间的一个指针
在python中从变量到对象的连接称为引用,也就是说,引用是一种关系,以内存中的指针的形式显示。一旦变量被使用(引用),python自动跟随这个变量到对象的连接。变量是一个系统表的元素,拥有指向对象的连接的空间。对象是被分配的一块内存,有足够的空间去表现他们所代表的值。引用是自动形成的从变量到对象的指针。
至少从概念上来讲,在脚本中,每一次用过运行一个表达式生成一个新的值,python都会创建一个对象去表现这个值。从内部来看,作为一种优化,python缓存了不变的对象并对其进行复用,例如,小的int和字符串。但是,从逻辑的角度来看,这工作起来就像每一个表达
式结构的值都是一个不同的对象,每一个对象都有不同的内存。 从技术来讲,对象有更复杂的结构而不仅仅是有足够的空间去表现她的值那么简单。每一个对象都有两个标准的头部信息:一个类型标识符去标示这个对象的类型,以及一个引用的计数器,用来决定是不是可以回收这个对象。
三、在python中动态执行包含python脚本的字符串 import sys
import StringIO
# create file-like string to capture output codeOut = StringIO.StringIO() codeErr = StringIO.StringIO() code = \def f(x):
x = x + 1 return x
print 'This is my output.' \
# capture output and errors sys.stdout = codeOut sys.stderr = codeErr exec code
# restore stdout and stderr sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ print f(4)
s = codeErr.getvalue() print \s = codeOut.getvalue() print \codeOut.close() codeErr.close()
四、python模块和类中的动态特性 (1)、动态加载类
说到动态的加载类,那就不得不说,动态的加态模块。因为只能成功的加模了模块才能加载到类。我们可以用,以下的代码来动态的加载类: #modulePath是模块文件的路径+模块的文件名。 aMod = sys.modules[modulePath]
当我们动态的加载了这个模块后,我们就可以从这个模块中取得要的类了。以 aClass= getattr(aMod, className) (2)、动态实例化类
得到了class对象之后,在python就可以很方便的得到他的对象,以下这代码 obj = new.instance(aClass) (3)、获取及改变对象、类或模块中的所有属性方法
如果想要得到对象中的所有属性和方法,在python中,因为是脚本语言,所以我们要得到这个些属性方法更加的方便,我们可以用以下的代码获得类,对象,模块中的所有的属性的