python是高级动态语言_Python动态语言之魅力揭秘
之前的文章跟大家讲解了鸭子类型,其实鸭子类型是编程语言中动态类型语言中的一种设计风格。今天跟大家一起谈谈动态语言的魅力。
根据维基百科,动态编程语言是这样子定义的:动态编程语言是高级编程语言的一个类别,在计算机科学领域已被广泛应用。它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。
动态语言是一门在运行时可以改变其结构的语言,这句话如何理解?
我们先看看示例1。
#示例1
class Person(object):
def __init__(self,name=None,age=None):
self.name = name
self.age = age
Jack = Person("Jack",18)
print(Jack.age)
在示例1中,我们定义了Person类,然后创建了Jack对象,打印对象的age属性,这没毛病。现实中人除了名字和年龄,还会有其他属性,例如身高和体重。我们尝试打印一下身高属性。
print(Jack.height)
毫无疑问,这会报错,因为Person类中没有定义height属性。但是如果在程序运行的时候添加height属性,会发生什么呢?,请看示例2和示例3。
#示例2
Jack.height = 170
print(Jack.height)
#输出结果:170
#示例3
setattr(Jack,'height',170)
print(Jack.height)
#输出结果:170
在示例2中,我们给Jack添加了height属性,然后打印,没有报错,可以输出结果。我们打印一下对象的属性。
print(Jack.__dict__)
#输出结果:
# {'name': 'Jack', 'age': 18, 'height': 170}
你看,本来对象是没有height属性,但是可以在程序运行过程中给实例动态绑定属性,这就是动态语言的魅力,不过还是有一些坑的,我们再看看示例4。
#示例4
Mia = Person('Mia',18)
print(Mia.__dict__)
#输出结果:
# {'name': 'mia', 'age': 18}
奇怪!Mia对象居然没有height属性。为什么?事实上,在示例2中,我们只是给类示例动态地绑定了一个属性,而不是给类绑定属性,所以重新创建的对象是没有height属性的。如果想要给类添加,也是可以的,见示例5。
#示例5
Person.height = None
Mia = Person("Mia",18)
print(Mia.height)
#输出结果:None
搞定了属性的动态绑定,其实动态删除也是同一个道理,请看示例5。
#示例5
Mia = Person("Mia",18)
delattr(Mia,'height')
print(Mia.__dict__)
#输出结果:{'name': 'mia', 'age': 18}
搞定了属性的动态绑定和删除,接下来看看方法的绑定和删除,请看示例6。
#示例6
class Person(object):
def __init__(self,name=None,age=None):
self.name = name
self.age = age
def speak_name(self):
print(self.name)
Jack = Person("Jack",18)
Jack.speak_name = speak_name
Jack.speak_name(Jack)
print(Jack.__dict__)
Mia = Person("Mia",18)
print(Mia.__dict__)
输出结果:
Jack
{'name': 'Jack', 'age': 18, 'speak': }
{'name': 'Mia', 'age': 18}
在示例6中,对象Jack的属性中已经成功添加了speak函数。但是!有没有感觉示例6中,这个语句
Jack.speak_name(Jack)
很别扭。按常理来说,应该
Jack.speak_name()
就行了。如果想要达到这种效果,应该要像下面这样子做。
import types
Jack.speak_name = types.MethodType(speak_name,Jack)
Jack.speak_name()
#输出结果:Jack
其中MethodType用于绑定方法对象。
当然示例6都是给类示例绑定了方法,但是如果要给类绑定方法的话,又应该怎么做?请看示例7。
#示例7
import types
class Person(object):
def __init__(self,name=None,age=None):
self.name = name
self.age = age
def speak_ok(cls):
print(OK)
Person.speak_name = types.MethodType(speak_ok,Person)
Person.speak_ok()
# 输出结果:OK
示例1-7给大家解析了维基百科对动态语言的定义,希望可以帮助你对Python的理解。
下面说一下比较容易混淆的概念。
动态类型语言与动态语言
其实动态类型语言跟动态语言是不一样的概念。动态类型语言指的是在运行期间才去判断数据类型的语言,强调的是数据类型。
动态语言指的是它是在运行时可以改变其结构的语言,强调的是代码结构。
静态类型语言与静态语言静态类型语言指的是运行之前(编译期间)会去判断数据类型的语言,强调的也是数据类型。
静态语言指的是在运行期间不能改变其结构的语言,强调的是代码结构。
公众号:CVpython
专注于分享Python和计算机视觉。我们坚持原创,不定期更新,希望我们的文章可以启发你,一起进步。
python是高级动态语言_Python动态语言之魅力揭秘相关推荐
- python是脚本语言_Python 脚本语言
python 脚本语言 (python的命名起源于一个脚本screenplay,每次运行都会使对话框逐字重复.由著名的"龟叔"Guido van Rossum在1989年圣诞节期间 ...
- python简单动态图_python动态图的绘制和保存
前言 这段时间要做一个涉及排队论的数学建模,需要动态绘图.建好了模,却没想到在原以为简单的绘图上耗费了我大量时间.原因在于用python作动态绘图的参考资料过于琐碎.因此在我费了九牛二虎之力终于实现动 ...
- python鸭制作类代码_Python动态语言与鸭子类型详解
今天来说说编程语言中的动态类型语言与鸭子类型. 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其 ...
- python 为什么动态语言_Python动态语言
python 说Python是动态语言,是由于Python可以在代码运行中可以做更改,但是像C.Java之类的需要编译的语言,由于做过编译就不可以做修改了,所以是静态语言.但是像Python.PHP. ...
- python动态参数_python动态参数
Python的动态参数有两种,分别是*args和**kwargs,这里面的关键是一个和两个星号的区别,而不是args和kwargs在名字上的区别,实际上你可以使用*any或**whatever的方式. ...
- python程序格式框架的描述_python 程序语言设计(嵩天)-学习笔记(第二章python 程序实例解析)...
第 2 章 python 程序实例解析 学习目标: 掌握解决计算问题的一般方法. 掌握python语言的基本语法,包括缩进.变量.命名等. 掌握python语言绘制图形的一般方法. 了解python标 ...
- python定义变量并赋值_Python动态声明变量赋值代码实例
这篇文章主要介绍了Python动态声明变量赋值代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过exec().globals()和loca ...
- python 实时监控日志文件_Python动态监控日志的内容
日志文件一般是按天产生,则通过在程序中判断文件的产生日期与当前时间,更换监控的日志文件 程序只是简单的示例一下,监控test1.log 10秒,转向监控test2.log 程序监控使用是linux的命 ...
- python手机自动化测试脚本语言_python脚本语言? Appium移动自动化测试
appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用. "移动原生应用"是指那些用iOS或者 Android SDK ...
最新文章
- FastReport.net 使用 Winform WebForm打印
- 月薪3万的程序员都避开了哪些坑
- 23种设计模式整体详解
- PHP CURL 哈哈哈哈哈记录一下
- linux libpcap 效率,Linux ubuntu PF_RING+libpcap 极速捕获千兆网数据包,不丢包
- Sql server 事务的两种用法
- GY歌谣之读懂每行代码(飞智) 2020 10 16 Duplicate keys detected
- 第一阶段冲刺 第三天
- activemq后台管理 看topic消息_17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列...
- mysql 5.1.69_CentOS 安装MySQL 5.1.69
- MySQL5.5编译工具configure向cmake过渡指南
- [转]国内Linux操作系统发行商分类溯源
- 管理新语:搞绩效考评需谨慎,切勿随意
- 用java设计空间管理系统_一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)...
- 2017.11.21 课程随记
- 如何删除vc2013上配置好的opencv
- 怎样将exe打包成服务运行
- linux I2C驱动实验
- 听《为什么时光飞逝》,耳目一新的人感知时光的科学研究观点
- 目前几种实时视频流协议对比