一、动态语⾔的定义

动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。现在比较热门的动态语言有:Python、PHP、JavaScript、Objective-C等,而 C 、 C++ 等语言则不属于动态语言。

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

class Person(object):
def __init__(self,name=None,age=None):
self.name=name
self.age=age p = Person("小明","")
print(p.name)
print(p.age)

运行结果为:

小明
24

这里我们只定义了name和age两个属性,但是在类已经定义好了之后,我们仍然可以往里面添加属性,这就是动态语言的好处,动态的给实例绑定属性:

class Person(object):
def __init__(self,name=None,age=None):
self.name=name
self.age=age p = Person("小明","")
print(p.name)
print(p.age) #动态添加属性
p.sex = "男"
print(p.sex)

运行结果为:

小明
24

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

class Person(object):
def __init__(self,name=None,age=None):
self.name=name
self.age=age P1 = Person("小明",24)
print(P1.sex)

运行结果为:

Traceback (most recent call last):
File "C:\Users\Se7eN_HOU\Desktop\test.py", line 8, in <module>
print(P1.sex)
AttributeError: 'Person' object has no attribute 'sex'

这是程序报错说,Person没有sex这个属性,我们可以通过给Person动态绑定属性,解决问题

class Person(object):
def __init__(self,name=None,age=None):
self.name=name
self.age=age P1 = Person("小明",24)
#动态给类添加属性
Person.sex = "男"
print(P1.sex)

这个时候在运行就不会出错,而且会打印出P1.sex为男

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

class Person(object):
def __init__(self,name=None,age=None):
self.name=name
self.age=age def eat(self):
print("正在吃东西") P1 = Person("小明",24)
P1.eat()
P1.run()

运行结果为:

正在吃东西
Traceback (most recent call last):
File "C:\Users\Se7eN_HOU\Desktop\test.py", line 11, in <module> P1.run()
AttributeError: 'Person' object has no attribute 'run'

说明:正在吃东西打印出来了,说明eat函数被执行,但是后面报错说没有run这个属性,但是我想在类创建好了以后,在运行的时候动态的添加run方法怎么办呢?

#动态添加方法需要导入types模块
import types
class Person(object):
def __init__(self,name=None,age=None):
self.name=name
self.age=age def eat(self):
print("正在吃东西") #定义好需要动态添加的方法
def run(self):
print("在跑步") P1 = Person("小明",24)
#正常调用类里面的函数
P1.eat() #给对象动态绑定方法
P1.run = types.MethodType(run,P1)
#对象调用动态绑定的方法
P1.run()

运行结果为:

正在吃东西
在跑步

打印出来“在跑步”说明run方法被正常执行了

动态绑定类方法和静态方法

#动态添加方法需要导入types模块
import types
class Person(object):
def __init__(self,name=None,age=None):
self.name=name
self.age=age def eat(self):
print("正在吃东西") #定义好需要动态添加的实例方法
def run(self):
print("在跑步") #定义好需要动态添加的类方法
@classmethod
def dynamicClassMethod(cls):
print("这是一个动态添加的类方法")
#定义好需要动态添加的静态方法
@staticmethod
def dynamicStaticMethod():
print("这是一个动态添加的静态方法") P1 = Person("小明",24)
#正常调用类里面的函数
P1.eat() #给对象动态绑定方法
#MethodType(参数1,参数2)
#参数1:是动态绑定哪个方法,只写方法名即可
#参数2:是把这个方法动态的绑定给谁
P1.run = types.MethodType(run,P1)
P1.run() #动态绑定类方法的使用
Person.dynamicClassMethod = dynamicClassMethod
Person.dynamicClassMethod() #动态绑定静态方法的使用
Person.dynamicStaticMethod = dynamicStaticMethod
Person.dynamicStaticMethod()

总结:

  1. 给对象绑定属性直接在使用前进行赋值使用即可
  2. 给对象动态绑定方法需要import types模块
  3. 给对象动态绑定实例方法,需要使用type.MethodType()方法
  4. 给类添加类方法和静态方法,也是直接在使用前赋值即可使用

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

删除的方法:

  1. del 对象.属性名
  2. delattr(对象, "属性名")
class Person(object):
def __init__(self,name=None,age=None):
self.name=name
self.age=age P1 = Person("小明",24)
print("---------删除前---------")
print(P1.name) del P1.name print("---------删除后---------")
print(P1.name)

运行结果为:

---------删除前---------
小明
---------删除后---------
print(P1.name)AttributeError: 'Person' object has no attribute 'name'

六、__slots__

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

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

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

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

class Person(object):
__slots__=("name","age") p = Person()
p.name = "老王"
p.age = 40
print(p.name)
print(p.age) #slots之外的属性
p.sex = "男"
print(p.sex)

运行结果为:

老王
40
p.sex = "男"
AttributeError: 'Person' object has no attribute 'sex'

注意:

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

python高级-动态特性(20)的更多相关文章

  1. python高级-面向对象特性(12)

    一.继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产,在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物:同理,波斯猫和巴厘猫都继承自猫,而沙 ...

  2. Python高级特性(3): Classes和Metaclasses(转)

    原文:Python高级特性(3): Classes和Metaclasses 类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个“类对象”并将其赋值给一个同名变 ...

  3. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...

  4. python高级特性:切片/迭代/列表生成式/生成器

    廖雪峰老师的教程上学来的,地址:python高级特性 下面以几个具体示例演示用法: 一.切片 1.1 利用切片实现trim def trim(s): while s[:1] == " &qu ...

  5. Python高级特性(2):Closures、Decorators和functools(转)

    原文:Python高级特性(2):Closures.Decorators和functools 装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过 ...

  6. Python高级特性之:List Comprehensions、Generator、Dictionary and set ...

    今天帅气的易哥和大家分享的是Pyton的高级特性,希望大家能和我一起学习这门语言的魅力. Python高级特性之:List Comprehensions.Generator.Dictionary an ...

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

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

  8. 三、python高级特性(切片、迭代、列表生成器、生成器)

    1.python高级特性 1.1切片 list列表 L=['Mli','add','sal','saoo','Lkkl'] L[0:3]  #即为['Mli','add','sal']  从索引0开始 ...

  9. python高级特性和高阶函数

    python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...

随机推荐

  1. menuStrip1动态添加菜单及快捷键

    public partial class FormMkTest : Form { public FormMkTest() { InitializeComponent(); } private void ...

  2. 【Linux】Ubuntu安装Mysql 8.0

    1.下载Mysql的安装配置,http://dev.mysql.com/downloads/repo/apt/ 2.执行配置配置文件 sudo dpkg -i mysql-apt-config_0.* ...

  3. 《ServerSuperIO Designer IDE使用教程》-3.Modbus协议,读取多个寄存器,实现多种数据类型解析。发布:v4.2.2版本

    更新内容,v4.2.2版本:1.增加Modbus协议读取多个寄存器,并且按多种数据类型解析数据.2.Modbus Serial和Modbus TCP两个驱动合并成一个驱动.3.修改数据库结构,保存配置 ...

  4. Redis 缓存失效和回收机制

    本文及后续文章,Redis版本均是v3.2.8 一.内存回收策略 maxmemory配置用于配置Redis存储数据时指定限制的内存大小.我们可以通过redis.conf配置或者使用CONFIG SET ...

  5. 在Eclipse中使用git把项目导入到git中--转载

    [转载出处注明:http://www.zhangxiaofu.cn/java/commonTools/2015/0607/764.html] 一.原有项目:  项目名为TestGit 二.在osc@g ...

  6. Eclipse 那些小技巧(值得收藏)

    1.菜单命令系列 Edit→content Assist→add Alt+/ 代码关联 Windows→Next Editor→add Ctrl+Tab 切换窗口 Run→Debug Toggle L ...

  7. java使用Jedis远程访问CentOs7linux时出现拒绝连接的错误

    使用Jedis出现Connection refused的解决方案 当我们利用Jedis操作服务器的Redis数据库时,需要先将远程服务器的端口(默认端口是6379)开放,命令如下:   #/sbin/ ...

  8. Unity3D核心类介绍

    脚本介绍与Unity核心类介绍 -------------------------------------------------------------------------------- 脚本介 ...

  9. react使用过程中常见问题

    目录 一.减小输入字符数 二.用props.children来引用位于前置标签和后置标签之间的内容 三.创建组件两条主要的途径 四.JSX属性采用驼峰式的大小写规则(即‘onClick’而非‘oncl ...

  10. P2V后,VMWare ESX 上RedHat AS5网络不通问题的解决办法

    现象: 机器在启动eth0后,可以ping通eth0的IP,但是很快就无法访问了. 原因: red hat 5.x 默认系统安装完成后为xen内核,那么xen内核引导启动后就会有虚拟网卡(vethx. ...