之前的文章跟大家讲解了鸭子类型,其实鸭子类型是编程语言中动态类型语言中的一种设计风格。今天跟大家一起谈谈动态语言的魅力。

根据维基百科,动态编程语言是这样子定义的:动态编程语言是高级编程语言的一个类别,在计算机科学领域已被广泛应用。它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。

动态语言是一门在运行时可以改变其结构的语言,这句话如何理解?

我们先看看示例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动态语言之魅力揭秘相关推荐

  1. python是脚本语言_Python 脚本语言

    python 脚本语言 (python的命名起源于一个脚本screenplay,每次运行都会使对话框逐字重复.由著名的"龟叔"Guido van Rossum在1989年圣诞节期间 ...

  2. python简单动态图_python动态图的绘制和保存

    前言 这段时间要做一个涉及排队论的数学建模,需要动态绘图.建好了模,却没想到在原以为简单的绘图上耗费了我大量时间.原因在于用python作动态绘图的参考资料过于琐碎.因此在我费了九牛二虎之力终于实现动 ...

  3. python鸭制作类代码_Python动态语言与鸭子类型详解

    今天来说说编程语言中的动态类型语言与鸭子类型. 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其 ...

  4. python 为什么动态语言_Python动态语言

    python 说Python是动态语言,是由于Python可以在代码运行中可以做更改,但是像C.Java之类的需要编译的语言,由于做过编译就不可以做修改了,所以是静态语言.但是像Python.PHP. ...

  5. python动态参数_python动态参数

    Python的动态参数有两种,分别是*args和**kwargs,这里面的关键是一个和两个星号的区别,而不是args和kwargs在名字上的区别,实际上你可以使用*any或**whatever的方式. ...

  6. python程序格式框架的描述_python 程序语言设计(嵩天)-学习笔记(第二章python 程序实例解析)...

    第 2 章 python 程序实例解析 学习目标: 掌握解决计算问题的一般方法. 掌握python语言的基本语法,包括缩进.变量.命名等. 掌握python语言绘制图形的一般方法. 了解python标 ...

  7. python定义变量并赋值_Python动态声明变量赋值代码实例

    这篇文章主要介绍了Python动态声明变量赋值代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过exec().globals()和loca ...

  8. python 实时监控日志文件_Python动态监控日志的内容

    日志文件一般是按天产生,则通过在程序中判断文件的产生日期与当前时间,更换监控的日志文件 程序只是简单的示例一下,监控test1.log 10秒,转向监控test2.log 程序监控使用是linux的命 ...

  9. python手机自动化测试脚本语言_python脚本语言? Appium移动自动化测试

    appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用. "移动原生应用"是指那些用iOS或者 Android SDK ...

最新文章

  1. FastReport.net 使用 Winform WebForm打印
  2. 月薪3万的程序员都避开了哪些坑
  3. 23种设计模式整体详解
  4. PHP CURL 哈哈哈哈哈记录一下
  5. linux libpcap 效率,Linux ubuntu PF_RING+libpcap 极速捕获千兆网数据包,不丢包
  6. Sql server 事务的两种用法
  7. GY歌谣之读懂每行代码(飞智) 2020 10 16 Duplicate keys detected
  8. 第一阶段冲刺 第三天
  9. activemq后台管理 看topic消息_17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列...
  10. mysql 5.1.69_CentOS 安装MySQL 5.1.69
  11. MySQL5.5编译工具configure向cmake过渡指南
  12. [转]国内Linux操作系统发行商分类溯源
  13. 管理新语:搞绩效考评需谨慎,切勿随意
  14. 用java设计空间管理系统_一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)...
  15. 2017.11.21 课程随记
  16. 如何删除vc2013上配置好的opencv
  17. 怎样将exe打包成服务运行
  18. linux I2C驱动实验
  19. 听《为什么时光飞逝》,耳目一新的人感知时光的科学研究观点
  20. 目前几种实时视频流协议对比

热门文章

  1. 我学UML建模系列之核心元素 -------- 参与者
  2. Roger Ver:BCH也可成为价值储备
  3. ASP.NET 弹出窗口
  4. TCL免污式洗衣机联手育儿网打响免污保卫战
  5. Kafka manager安装 (支持0.10以后版本consumer)
  6. Linux 设置 Swap 空间
  7. linux shell 基础 使用日志与心得
  8. H3C路由器的备份与还原(1)
  9. 网络不通 从“本地连接”中找问题
  10. 解决zabbix3.4图表显示中文乱码问题