一、动态语言相关概念

1.1 动态语言

  • 在运行时代码可以根据某些条件改变自身结构
  • 可以在运行时引进新的函数、对象、甚至代码,可以删除已有的函数等其他结构上的变化
  • 常见的动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang

1.2 动态类型语言

  • 在运行期间检查数据类型的语言
  • 数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段
  • 常见的动态类型语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl

1.3 强类型语言

  • 一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型
  • 常见的强类型语言:Java、C#、Python、Object-C、Ruby

Python是动态语言,动态类型语言,也是强类型语言。所以Python可以在运行时改变自身结构,动态添加/删除属性和方法。接下来将介绍Python如何动态添加属性和方法。

二、动态添加属性

2.1 添加对象属性

class Obj(object):
def __init__(self):
self.name = '张亚飞' obj = Obj()
obj.age = 23
print(obj.age)
obj2 = Obj()
print(obj2.age)
由以上代码可知,Obj类有两个属性:name和age。通过[对象名.属性名]给类对象obj动态添加了对象属性addr,而Obj的另一个类对象obj2却不能调用这个属性。
注:通过对象名添加的对象属性,只有这个对象能使用

2.2 添加类属性

Obj.score = 100
print(obj.score)
print(obj2.score)
 由以上代码可知,通过[类名.属性名]给类Obj动态添加了类属性addr,Obj的类对象obj和obj2都能调用这个属性
    注:通过类名添加的类属性,这个类的所有对象都能使用
 

三、动态添加方法

类中有三种方法,实例方法,静态方法和类方法,三种方法的区别如下:
实例方法:需要绑定要一个对象上,第一个参数默认使用self,会把对象作为第一个参数传递进来
静态方法:使用装饰器@staticmethod进行定义,类和对象都可以调用,不需要默认参数
类方法:使用装饰器@classmethod进行定义,类和对象都可以调用,第一个参数默认使用cls,会把类作为第一个参数传递进来

from types import MethodType

class Obj(object):
# __slots__ = ('name', 'age') def __init__(self):
self.name = '张亚飞' def set_score(self, score):
self.score = score @staticmethod
def static_func():
print('static_func') @classmethod
def class_func(cls):
print('class_method')
“““
类中有三种方法,实例方法,静态方法和类方法,三种方法的区别如下:
实例方法:需要绑定要一个对象上,第一个参数默认使用self,会把对象作为第一个参数传递进来
静态方法:使用装饰器@staticmethod进行定义,类和对象都可以调用,不需要默认参数
类方法:使用装饰器@classmethod进行定义,类和对象都可以调用,第一个参数默认使用cls,会把类作为第一个参数传递进来
”””
# 动态添加实例方法
obj = Obj()
obj.set_score = MethodType(set_score, obj)
obj.set_score(99)
print(obj.score) # 99
obj2.set_score(99) # AttributeError: 'Obj' object has no attribute 'set_score'
"""
由以上代码可知,Obj类有一个方法:eat()方法。通过[types.MethodType(方法名, 对象名)]给类对象zhangsan动态添加了对象方法run(),同理,Obj的另一个类对象lisi不能调用这个方法
注:通过对象名添加的对象方法,只有这个对象能使用
"""
# 添加静态方法
Obj.static_func = static_func
Obj.static_func()
obj.static_func()
obj2.static_func()
"""
由以上代码可知,通过[类名.静态方法名]给类Obj动态添加了静态方法static_func(),Obj类的Obj对象和obj2对象都能调用这个方法
注:通过类名添加的静态方法,这个类及这个类的所有对象都能使用
"""
# 添加类方法
Obj.class_func = class_func
Obj.class_func()
obj.class_func()
obj2.class_func()
"""
由以上代码可知,通过[类名.类方法名]给类Obj动态添加了类方法class_func(),Obj类的obj对象和obj2对象都能调用这个方法
注:通过类名添加的类方法,这个类及这个类的所有对象都能使用
"""

四、__slots__的使用

  通过以上内容,我们知道了如何动态的添加属性和方法。但是,如果我们想要限制class的属性该怎么办?例如:只允许Obj实例添加name和age属性。为了达到这个目的,Python允许在定义class的时候,定义一个特殊变量__slots__来限制该class能添加的属性。

class Obj(object):
__slots__ = ('name', 'age')

obj = Obj()
obj.name = 'zhangyafei'
obj.age = 23
obj.score = 99 # AttributeError: 'Obj' object has no attribute 'score'
Obj.score = 100
print(obj.score) # 100
obj.score = 99 # AttributeError: 'Obj' object attribute 'score' is read-only

通过以上代码可知,__slots__对Obj类的动态添加没有限制,而Obj类对象obj不能再动态添加对象属性和方法。

对于__slot__有以下几个需要注意的地方:

  • __slots__只对类对象进行限制,不对类进行限制
  • __slots__不仅限制类对象的属性,还限制类对象的方法
  • __slots__仅对当前类起作用,对继承的子类不起作用
  • 在子类中定义__slots__,子类允许定义的属性就是自身的__slots__加上父类的__slots__

Python动态语言的特性的更多相关文章

  1. 深度解析Python动态语言

    1.动态语言的定义 动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结 ...

  2. python 动态语言 __slots__

    python 是动态语言,就是说可以动态的创建属性, 别的语言不行,再创建类的时候已经规定好了 使用__slots__,注意要用tuple定义同意绑定的属性名称,仅对当前类起作用,对继承的子类是不起作 ...

  3. python 动态语言和协议编程

    动态语言:不需要去定义变量的类型 协议编程:一个类实现了某个魔法函数,这个类就是什么类型,理解为协议

  4. Python 动态语言

    1.在C++中,Animal a = Person(); 这样写是不行的,因为a的内容不能使用Person的内容来填充. 2.在Python中,变量不需要声明,而且可以赋任何值.Python是如何做到 ...

  5. Python 语言特性:编译+解释、动态类型语言、动态语言

    1. 解释性语言和编译性语言 1.1 定义 1.2 Python 属于编译型还是解释型? 1.3 收获 2. 动态类型语言 2.1 定义 2.2 比较 2. 动态语言(动态编程语言) 3.1 定义 3 ...

  6. 动态语言 VS 静态语言

    静态语言 VS 动态语言 动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.通俗点说就是在运行时代码可以根据某些条件改变自 ...

  7. Azure Table storage 之改进DynamicTableEntity类为其添加动态语言扩展

    在之前的一篇文章中提到,storage类库中包含一个可以用来动态获取Azure table storage 表结构的类-DynamicTableEntity. 我们可以通过这个类,我们无需为每一个表提 ...

  8. 什么是动态语言 OC 的runtime

    OC是一门 动态语言. 问题来了.什么是动态语言? 与之相对的静态语言? 学习C++的时候,记得一个名词:“运行时的动态绑定”. 这个是 “多态”的概念. 简单提一下:关键:类指针可以指向本类,或者其 ...

  9. Python的动态语言特性; __slots__属性

    python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...

随机推荐

  1. 关于SQL数据库 msdb.dbo.sp_send_dbmail 函数发送邮件的几个实例

    在推行系统中,时不时会有用户提出希望系统能自动推送邮件,由于手头的工具和能力有限,不少需求都借助于sql server的邮件触发来实现. 步骤: 1.配置邮箱.步骤略,网上有不少帖子说明,手工直接在管 ...

  2. Cs231n课堂内容记录-Lecture 9 深度学习模型

    Lecture 9 CNN Architectures 参见:https://blog.csdn.net/qq_29176963/article/details/82882080#GoogleNet_ ...

  3. 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量

    概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ...

  4. 英语背单词app

    乐词 √ 真人发音 词根词缀 小组计划及时复习 真人例句 墨墨 单词量测试做的特别好 扇贝 哈哈哈,没用过 百词斩 同样25个单词,我在乐词中背了20分钟,在百词斩中需要60分钟. 原因在于 要记单词 ...

  5. Dijango学习_01_pycharm创建应用

    一.当初在学dijango的时候,网上的教程非常的杂且多,对于؏؏☝ᖗ乛◡乛ᖘ☝؏؏我们这种初入虎门的小白来说有太多误区 (其实是大佬的操作着实对小白不太友好,原谅我个萌新..2333..) 二.pi ...

  6. Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization

    用于理解恶意软件的内部工作原理,并发现系统中的漏洞,逆向工程是一种耗费人工的却很重要的技术.汇编克隆搜索引擎是通过识别那些重复的或者已知的部件来帮助逆向工程师的工作,要想设计健壮的克隆搜索引擎是一项挑 ...

  7. Visual Studio 2017的安装与使用

    Visual Studio 2017的安装与使用 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 下载Visual Studio 2017 在官网 ...

  8. jvisualvm 连接 jstatd 远程监控 jvm 或 Visual GC提示"不受此JVM支持“

    Visual GC提示"不受此JVM支持",可以使用此方法解决. 一.添加配置文件 jstatd.all.policy [root@localhost /]# cd /usr/lo ...

  9. git冲突解决办法合集

    一 换行符CRLF错误解决办法 1 错误产生原因 不同的操作系统使用的换行符是不一样的. unix/linux使用的是LF,max后期也采用了LF,但在windows一直采用的CRLF(回车)换行符. ...

  10. js 设备判断(移动端pc端 安卓ios 微信)

    苹果安卓判断 $(function () { var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.in ...