python 为什么动态语言图片_聊聊动态语言那些事(Python)

动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用。它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力,例如JavaScript便是一个动态语言,除此之外如 PHP 、Ruby 、Python等也都属于动态语言,而 C、C++ 、Java等语言则不属于动态语言。

在这里,我们以Python举例进行说明:

1. 运行的过程中给对象绑定(添加)属性

>>> classPerson(object):def __init__(self, name = None, age =None):

self.name=name

self.age=age>>> P = Person("小明", "24")>>>

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

>>> P.sex = "male"

>>>P.sex'male'

>>>

这时候就发现问题了,我们定义的类里面没有sex这个属性啊!怎么回事呢? 这就是动态语言的魅力和坑! 这里实际上就是动态给实例绑定属性!

2.运行的过程中给类绑定(添加)属性

>>> P1 = Person("小丽", "25")>>>P1.sex

Traceback (most recent call last):

File"", line 1, in P1.sex

AttributeError: Person instance has no attribute'sex'

>>>

我们尝试打印P1.sex,发现报错,P1没有sex这个属性!给P这个实例绑定属性对P1这个实例不起作用! 那我们要给所有的Person的实例加上sex属性怎么办呢? 答案就是直接给Person绑定属性!

>>>> Person.sex = None #给类Person添加一个属性

>>> P1 = Person("小丽", "25")>>> print(P1.sex) #如果P1这个实例对象中没有sex属性的话,那么就会访问它的类属性

None #可以看到没有出现异常

>>>

3. 运行的过程中给类绑定(添加)方法

我们直接给Person绑定sex这个属性,重新实例化P1后,P1就有sex这个属性了! 那么function呢?怎么绑定?

>>> classPerson(object):def __init__(self, name = None, age =None):

self.name=name

self.age=agedefeat(self):print("eat food")>>> defrun(self, speed):print("%s在移动, 速度是 %d km/h"%(self.name, speed))>>> P = Person("老王", 24)>>>P.eat()

eat food>>>

>>>P.run()

Traceback (most recent call last):

File"", line 1, in P.run()

AttributeError: Person instance has no attribute'run'

>>>

>>>

>>> importtypes>>> P.run =types.MethodType(run, P)>>> P.run(180)

老王在移动,速度是180 km/h

那么在Python中最常见的是三类方法,分别是实例方法,类方法和静态方法,这里我们分别添加一下:

importtypes#定义了一个类

classPerson(object):

num=0def __init__(self, name = None, age =None):

self.name=name

self.age=agedefeat(self):print("eat food")#定义一个实例方法

defrun(self, speed):print("%s在移动, 速度是 %d km/h"%(self.name, speed))#定义一个类方法

@classmethoddeftestClass(cls):

cls.num= 100

#定义一个静态方法

@staticmethoddeftestStatic():print("---static method----")#创建一个实例对象

P = Person("老王", 24)#调用在class中的方法

P.eat()#给这个对象添加实例方法

P.run =types.MethodType(run, P)#调用实例方法

P.run(180)#给Person类绑定类方法

Person.testClass =testClass#调用类方法

print(Person.num)

Person.testClass()print(Person.num)#给Person类绑定静态方法

Person.testStatic =testStatic#调用静态方法

Person.testStatic()

执行结果:

4. 运行的过程中删除属性、方法

删除的方法:

del 对象.属性名

delattr(对象, "属性名")

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

那么怎么避免这种情况呢? 请使用__slots__。

5. __slots__

动态语言:可以在运行的过程中,修改代码。

静态语言:编译时已经确定好代码,运行过程中不能修改。

如果我们想要限制实例的属性怎么办?比如,只允许对Person实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

>>> classPerson(object):__slots__ = ("name", "age")>>> P =Person()>>> P.name = "老王"

>>> P.age = 20

>>> P.score = 100Traceback (most recent call last):

File"", line 1, in AttributeError: Person instance has no attribute'score'

>>>

使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。

In [67]: classTest(Person):

...:pass...:

In [68]: t =Test()

In [69]: t.score = 100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器的那点事

当我们的后端服务器不够用的时候,我们可以通过容器技术,可以快速的把这些服务器全部虚拟出来, 当然这个虚拟跟虚拟机是不一样的,比虚拟机的方式快多了,早期阿里的淘宝平台如果整个坏掉了,重新搭建部署起来需…

lqb——修改数组

思路 **常规思路用哈希表的思想,设置bool数组标识是否被占用过,但是发生矛盾时将会造成查找需要遍历整个数组,比如,1,2,3……100000已连续占用,此时再插入1,将会一直遍历这100000个数,极端情况下,插入100000个1,将是n平方的复杂度。 如何快速查找到插入位置,这就引…

bp神经网络训练_数据分析模型6——神经网络基础(人工智能的底层模型)

未经许可请勿转载更多数据分析内容参看这里今天我们来学习人工智能的底层模型——神经网络(NEURAL NETWORKS),现在比较热门的一个模型是深度学习,深度学习的基础也是神经网络,要学好深度学习,神经网络不了解…

四种最令人讨厌的编程语言:Java、Javascript、C++和Perl

喜欢就关注我们吧!TIOBE 12 月榜单已于日前公布,在最新的排行榜中,C 语言仍高居榜首,其次分别是 Java、Python 和 C。在编程语言这一领域中,许多编程语言都会随着时间的推移而经历人气的激增,以及历史迭代之…

机器学习之数据预处理——特征编码(标签编码,独热编码)

机器学习之数据预处理——特征编码 数据预处理——特征编码离散数据的编码标签编码sklearn LabelEncoder(使用fit_transform函数)sklearn LabelEncoder(反向变换可以用函数 inverse_transform)独热编码sklearn OneHotEncoder机器学习里有一句名言:数据和特征决定了机器学习的上…

微软用的工具,统一财务三大表及高级分析通用模板

虽然罗叔并非财务专业,但大概了解一些财务常识。例如财务报表的三大报表以及一些常见分析等。本月《BI真经》视频课程即将就绪,后续罗叔将和大家开展更多的业务研究。我们知道,PowerBI 在绘制某些报告时候很难,初学者根本无法实现…

文件 单片机_如何查看你写的单片机程序有多大?

单片机我们都用过,我们知道单片机的FLASH有4K的,有8K的,单片机程序我们也写过,但是我们写好的程序有多大,你知道吗?程序写好并编译后生成hex文件,这个hex文件就是要下载到单片机里的文件&#x…

机器学习之数据预处理——数据清洗(缺失值、异常值和重复值的处理)

机器学习之数据预处理——数据清洗缺失值、异常值和重复值的处理 基础知识技术点总结数据列缺失的处理方法1、丢弃(缺失值处理)1、生成一份随机数据2、查看哪些值缺失3、获得含有NA的列4、获取全部为NA的列5、丢弃缺失值2、补全(缺失值处理)1、使用sklearn将缺失值替换为特…

小说中场景的功能_如何让你的小说中的场景转换自如?

很多人很头疼场景、时间转换要怎么办,可以用章节作为转换的过渡,那么章节内呢?我看到最普通的做法就是画分割线,殊不知这种做法在稍微有点阅读功底的读者眼中都是很……怎么说,很没品吗?嗯,或许…

夏虫不可语冰

此次事件让我再次体会到了什么是“夏虫不可语冰”。博客园有些人压根没看完你的文章,带着已有认知断章取义不暇思索上来就是喷。不过,以前也遇到过,现在也慢慢习惯了。对于托管堆内存泄漏的说法,不管认不认同,我还是希…

机器学习之数据预处理——归一化,标准化

机器学习之数据预处理——归一化,标准化 基础知识1.什么是特征预处理2.预处理方法 :3.预处理API:数据的标准化(normalization)和归一化数据的标准化数据归一化1 把数变为(0,1)之间的小数2 把有量纲表达式变为无量纲表达式常用归一化方法最大-最小标准化(MinMaxScaler)Z-s…

css less 不要作用到子对象_使用Less实现网站主题切换

v-easy-components change theme很多初学前端的开发同学一定有一种想法,就是如何更改网站的主题。前年(2018),我也陷入了思考,如何切换网站主题呢?当时不知道less,只想到一种办法,就…

展望2021,Java、Go、.NET,谁主沉浮?

伴随着年底.NET社区活动,近日跟几位微软MVP大佬聊天请益,收获颇丰。程序员都有个话题避不开,就是各编程语言的优劣,大佬们的见识既有意思也有深度,这里为大家整理一下,其中Java、Golang和.NET是讨论焦点。J…

机器学习之数据集划分——训练集测试集划分,划分函数,估计器的使用

训练集测试集划分,划分函数,估计器的使用参考文章训练集、验证集和测试集的划分及交叉验证的讲解划分训练集和测试集的函数学习sklearn数据集,数据集划分,估计器详细讲解参考文章 训练集、验证集和测试集的划分及交叉验证的讲解 …

labuladong 的算法小抄_关于算法笔试的几个套路,一点就透

以下文章来源于labuladong ,作者labuladong我知道各位是被标题吸引进来的,那就不废话,先说几个算法笔试的硬核套路,再说说语言选择和做题复习的策略。避实就虚大家也知道,大部分笔试题目都需要你自己来处理输入数据&am…

TVP两周年:携手同行,让未来可见

TVP两周年2018年12月15日,在北京的腾讯云社区开发者大会上,作为腾讯云构建开发者生态的重要战略,TVP计划正式发布。2020年12月15日,不知不觉,腾讯云TVP已经走过了两度春秋。从0到1的探索,1到10的成长&#…

机器学习日常练习——红楼梦作者分析(聚类)

红楼梦作者分析(聚类) 实验要求实验题目:《红楼梦》作者分析实验目的实验内容资料下载实验过程:问题分析:解决思路:代码:代码一:出现的问题文件编码问题将红楼梦数据,按照章节进行划分(使用到了正则表达式)数据进行标准化处理(最大最小标准化)使用了两种聚类方法(均…

加密封装 怎么把_不要再封装各种Util工具类了,这个神级框架值得拥有!

Hutool 谐音 “糊涂”,寓意追求 “万事都作糊涂观,无所谓失,无所谓得” 的境界。Hutool 是一个 Java 工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让 Java 语言也可以 “…

Oh my God, Swagger API文档竟然可以这样写?

最好的总会在不经意间出现。“作为后端程序员,免不了与前端同事对接API, 一个书写良好的API设计文档可有效提高与前端对接的效率。为避免联调时来回撕逼,今天我们聊一聊正确编写Swaager API文档的姿势。基础Swagger用法在ConfigureServices配…

机器学习之格式变化——reshape(-1,1)

格式变化——reshape函数 知识基础代码知识基础 reshape(行数,列数)常用来更改数据的行列数目 一般可用于numpy的array和ndarray, pandas的dataframe和series(series需要先用series.values把对象转化成ndarray结构) 那么问题来了reshape(-1,1)是什么意思呢?难道有-1行? 这…