为什么说Python是一门动态语言--Python的魅力

动态语言的定义:动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用。它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力。众所周知的ECMAScriptJavaScript)便是一个动态语言,除此之外如PHPRubyPython等也都属于动态语言,而CC++等语言则不属于动态语言。----来自维基百科

你是不是有过给class里面变量赋值却发现程序没达到自己预期结果的遭遇?是不是本来赋值给class.abc却赋给了class.abd?这其实是动态语言惹的“祸”!【博主以前玩的是java】我们先来试着玩一玩

>>> class Person():
	def __init__(self, name = None, age = None):
	    self.name = name
	    self.age = age

>>> P = Person("The_Third_Wave", "24")
>>> 

在这里,我们定义了1个类Person,在这个类里,定义了两个初始属性name和age,但是人还有性别啊!如果这个类不是你写的是不是你会尝试访问性别这个属性呢?

>>> P.sexuality = "male"
>>> P.sexuality
'male'
>>> 

这时候就发现问题了,我们定义的类里面没有sexuality这个属性啊!怎么回事呢?这就是动态语言的魅力和坑!这里实际上就是动态给实例绑定属性!所以博主“当年”从java转python被“坑”(无知啊)过!我们再看下一个例子

>>> P1 = Person("Wave", "25")
>>> P1.sexuality

Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    P1.sexuality
AttributeError: Person instance has no attribute 'sexuality'
>>> 

我们尝试打印P1.sexuality,发现报错,P1没有sexuality这个属性!----给P这个实例绑定属性对P1这个实例不起作用!

那我们要给所有的Person的实例加上sexuality属性怎么办呢?答案就是直接给Person绑定属性!

>>>> Person.sexuality = None
>>> P1 = Person("Wave", "25")
>>> print P1.sexuality
None
>>> 

我们直接给Person绑定sexuality这个属性,重行实例化P1后,P1就有sexuality这个属性了!

那么function呢?怎么绑定?

>>> class Person():
	def __init__(self, name = None, age = None):
	    self.name = name
	    self.age = age
	def eat(self):
	    print "eat food"

>>> def run(self, speed):
	print "Keeping moving, the speed is %s km/h" %speed

>>> P = Person("The_Third_Wave", "24")
>>>
KeyboardInterrupt
>>> P.run()

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    P.run()
AttributeError: Person instance has no attribute 'run'
>>> P.eat()
eat food
>>> import types
>>> Person.run = types.MethodType(run, None, Person)
>>> P.run(180)
Keeping moving, the speed is 180 km/h
>>> 

绑定我们了解了,但是怎么删除呢?

请看以下例子首先给的是属性的真删:

>>> P.name
'The_Third_Wave'
>>> P.sex

Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    P.sex
AttributeError: Person instance has no attribute 'sex'
>>> setattr(P, "sex", "male") # 増
>>> P.sex
'male'
>>> delattr(P, "name") # 删
>>> P.name

Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    P.name
AttributeError: Person instance has no attribute 'name'
>>> 

添加方法呢?

>>> class Person():
	def __init__(self, name = None, age = None):
	    self.name = name
	    self.age = age
	def eat(self):
	    print "eat food"

>>> P = Person("The_Third_Wave", "24")
>>> P.eat()
eat food
>>> P.run()

Traceback (most recent call last):
  File "<pyshell#41>", line 1, in <module>
    P.run()
AttributeError: Person instance has no attribute 'run'
>>> def run(self, speed):
	print "Keeping moving, the speed is %s" %speed

>>> setattr(P, "run", run)
>>> P.run(360)

Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    P.run(360)
TypeError: run() takes exactly 2 arguments (1 given)
>>> P.run(1, 360)
Keeping moving, the speed is 360
>>> 

删除

>>> delattr(P, "run")
>>> P.run()

Traceback (most recent call last):
  File "<pyshell#48>", line 1, in <module>
    P.run()
AttributeError: Person instance has no attribute 'run'
>>> 

通过以上例子可以得出一个结论:相对于动态语言,静态语言具有严谨性!所以,玩动态语言的时候,小心动态的坑!

那么怎么避免这种情况呢?请使用__slots__,但是我的是2.7.6版本,测试是不行的!代码如下:

>>> class Person():
	__slots__ = ("location", "run")

	def __init__(self, name = None, age = None):
	    self.name = name
	    self.age = age

	def eat(self):
	    print "eat food"

>>> P = Person()
>>> P.sex

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    P.sex
AttributeError: Person instance has no attribute 'sex'
>>> P.sex = "male"
>>> 

具体原因是什么呢,本来是准备请等待更新:ing...的

BUT,我多写了个object就出来了。。。这可真是个神坑!soga!

>>> class Person(object):
	__slots__ = ("location", "run")

	def __init__(self, name = None, age = None):
	    self.name = name
	    self.age = age

	def eat(self):
	    print "eat food"

>>> P = Person()

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    P = Person()
  File "<pyshell#11>", line 5, in __init__
    self.name = name
AttributeError: 'Person' object has no attribute 'name' # 顺便还发现了个注意事项:要预先定义的属性也要写到tuple里面!
>>> class Person(object):
	__slots__ = ("name", "age", "eat", "location", "run")

	def __init__(self, name = None, age = None):
	    self.name = name
	    self.age = age

	def eat(self):
	    print "eat food"

>>> P = Person()
>>> P.sex = "male"

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    P.sex = "male"
AttributeError: 'Person' object has no attribute 'sex'
>>> P.location = "china"
>>> P.location
'china'
>>> def run(self, speed):
	print "Keeping moving, the speed is %s km/h" %speed

>>> setattr(P, "run", run)
>>> P.run(u"请注意这儿参数和上面有个例子不一样哦", 720)
Keeping moving, the speed is 720 km/h
>>> 

顺便还发现了个注意事项:要预先定义的属性也要写到tuple里面!

暂时写到这,不定期更新ing...

关于slots的demo原文:https://docs.python.org/2/reference/datamodel.html?highlight=__slots__#__slots__

本文由@The_Third_Wave原创。不定期更新,有错误请指正。

Sina微博关注:@The_Third_Wave

如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址。

为什么说Python是一门动态语言--Python的魅力

时间: 2024-10-13 01:11:05

为什么说Python是一门动态语言--Python的魅力的相关文章

PYTHON是一门动态解释性的强类型定义语言——优缺点

PYTHON是一门动态解释性的强类型定义语言:编写时无需定义变量类型:运行时变量类型强制固定:无需编译,在解释器环境直接运行. 优点: Python的定位是"优雅"."明确"."简单",所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序. 开发效率非常高,Python有非常强大的第三方库,基本上你想通过计算机实现任何功能,Python官方库里都有相应的模块进行支持,直接下载

C#操作动态语言----Python

ususing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Scripting.Hosting;

【程序员技术练级】学习一门脚本语言 python(一)文件处理

现在工作上主要用的语言是java,java在企业级的应用上能够发挥很好的用途,但有时候要做一个小功能时,比如批量更新文件,抓取网页等,这时候用java就显得太笨重了.因此就学习了python这门脚本语言. 这篇随笔主要是讲述python怎么处理文本文件,顺便巩固下python的一些基本知识. 好了,开始吧...... 需求阐述 处理文本文件:读一个本地文件,逐行处理 说到处理文件,不得不说下python的内置函数 open open(file, mode='r', buffering=-1, e

python是强类型动态语言

强弱类型语言区别: 如果语言经常隐式地转换变量的类型,那这个语言就是弱类型语言,如果很少会这样做,那就是强类型语言. Python很少会隐式地转换变量的类型,所以Python是强类型的语言. 值得注意的是: bool类的源码: bool类的父类是int--所以实际上: 在Python中==其实调用的是__eq__方法,而bool类继承自int类,又没有重写__eq__方法,所以在使用==的时候,bool类的对象自然就会调用父类的__eq__方法了,自然就会出现上面的这种情况了. 最后来一张图:

【程序员技术练级】学习一门脚本语言 python(二)遍历本地文件系统

这篇将讲述怎么使用python来遍历本地文件系统,并把文件按文件大小从小到大排序的一个小例子 在这个例子中,主要会用到python内置的和OS模块的几个函数: os.walk() : 该方法用来遍历指定的文件目录,返回一个三元tuple(dirpath, dirnames, filenames) ,其中dirpath为当前目录路径,dirnames为当前路径下的文件夹,filenames为当前路径下的文件 os.path.join() :可以用来连接目录和文件名,这样就可以得到某个文件的全路径了

①Python 是一门什么样的语言?

编程语言主要从以下几个角度为进行分类,编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言,每个分类代表什么意思呢,我们一起来看一下. 编译型和解释型我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码.这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler).如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了.但对

Python是一门什么样的语言

先做个总结:Python是一门动态解释型的强类型定义语言. 那何为动态?何为解释?何为强类型呢? 我们需要了解编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言这6个概念就可知晓. 编译型和解释型 我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码.这个过程说的专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler).如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会

动态语言的灵活性是把双刃剑 -- 以Python语言为例

本文有些零碎,总题来说,包括两个问题:(1)可变对象(最常见的是list dict)被意外修改的问题,(2)对参数(parameter)的检查问题.这两个问题,本质都是因为动态语言(动态类型语言)的特性造成了,动态语言的好处就不细说了,本文是要讨论因为动态--这种灵活性带来的一些问题. 什么是动态语言(Dynamic Programming language)呢,是相对于静态语言而言,将很多静态语言编译(compilation)时期所做的事情推迟到运行时,在运行时修改代码的行为,比如添加新的对象

在大型项目上,Python 是个烂语言吗

Robert Love, Google Software Engineer and Manager on Web Search. Upvoted by Kah Seng Tay, I was the Head TA for a class taught in Java at MIT. I used… Robert has 10+ answers in Google Engineering. Man, I cannot imagine writing let alone maintaining a