一、动态语⾔的定义

动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。现在比较热门的动态语言有: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. Flink on yarn的配置及执行

    1. 写在前面 Flink被誉为第四代大数据计算引擎组件,即可以用作基于离线分布式计算,也可以应用于实时计算.Flink可以自己搭建集群模式已提供为庞大数据的计算.但在实际应用中.都是计算hdfs上的 ...

  2. JAVA-MyBaits对应XML的两种使用方式

    概述 在使用XML写SQL语句的时候,遇到参数传递的两种方式,也就是Mapper里面带@Param注解和不带的情况,容易混淆,对应XML的写法也不相同,使用的时候要注意对照代码比对(备注XML里面的关 ...

  3. 在本机eclipse中创建maven项目,查看linux中hadoop下的文件、在本机搭建hadoop环境

    注意 第一次建立maven项目时需要在联网情况下,因为他会自动下载一些东西,不然突然终止 需要手动删除断网前建立的文件 在eclipse里新建maven项目步骤 直接新建maven项目出了错      ...

  4. 欧朋Opera 浏览器(打不开百度)提示“您的连接不是私密连接”,解决办法

    它网页报错SSL.提示“您的连接不是私密连接” 打开opera://net-internals/#hsts,操作如下图片,三步以后,ok 如果是其他外国浏览器,用这个办法也有效,可以把前面的 oper ...

  5. Pytorch: cuda runtime error (59) : device-side assert triggered at /pytorch/aten/src/THC/generic/THCTensorMa

    更换了数据集, 在计算交叉熵损失时出现错误 : cuda runtime error (59) : device-side assert triggered at /pytorch/aten/src/ ...

  6. UWB DWM1000 跟随小车原理---一张图演示

    更多内容参考论坛:bphero.com.cn

  7. hyperopt自动调参

    hyperopt自动调参 在传统机器学习和深度学习领域经常需要调参,调参有些是通过通过对数据和算法的理解进行的,这当然是上上策,但还有相当一部分属于"黑盒" hyperopt可以帮 ...

  8. 关于Python2 与 Python3 的区别

    Python是一门动态解释性的强类型定义语言. 1.Python2 : ①.臃肿,源代码的重复量很多.   ②.语法不清晰,掺杂着C,php,Java的一些陋习. Python3 : 几乎是重构后的源 ...

  9. linq给list集合数据分页

    var lastlist= newlist.Skip(pageindex * pagesize).Take(pagesize);

  10. 微信小程序开发----微信开发者工具使用

    新建项目选择小程序项目,选择代码存放的硬盘路径,填入刚刚申请到的小程序的 AppID,给你的项目起一个好听的名字,最后,勾选 "创建 QuickStart 项目" (注意: 你要选 ...