广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python高级-动态特性(20)
  • 219
分享到

python高级-动态特性(20)

特性高级动态 2023-01-31 00:01:46 219人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

一、动态语⾔的定义

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

 

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

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

p = Person("小明","24")
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("小明","24")
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__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

--结束END--

本文标题: python高级-动态特性(20)

本文链接: https://www.lsjlt.com/news/181911.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python高级-动态特性(20)
    一、动态语⾔的定义 动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。现在比较热门的动态语言有:Python、PHP、JavaScript、Objective-C等,而 C 、 C++...
    99+
    2023-01-31
    特性 高级 动态
  • Python 高级特性
    这章有关Python中被认为高级的特性——就是说并不是每个语言都有的,也是说它们可能在更复杂的程序或库中更有用,但不是说特别特殊或特别复杂。 强调这点很重要:这一章仅仅关于语言自身——关于辅之以Python的标准库功能的特殊语法所支持的特...
    99+
    2023-01-31
    特性 高级 Python
  • Python--高级特性
    高级特性生成器读取生成器元素的两种方式:•g.next()•for循环读取; (生成器实质上是可迭代对象);•列表生成式(列表生成式是Python 内置的非常简单却强大的可以用来创建 list的生成式), 当生成时元素即打印, 会占用内存;...
    99+
    2023-01-31
    特性 高级 Python
  • python 高级特性:List Com
    列表生成式: 创建List格式:        新列表 = [表达式/函数 for 变量 in 旧列表]一、普通创建List#!/usr/bin/python#common establish waylis1 = [];for x in r...
    99+
    2023-01-31
    特性 高级 python
  • Python学习之高级特性
    切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取。这种方法可以帮助我们依次获取我们想要的元素。而切片可以帮助我们获取被切片元...
    99+
    2023-01-30
    特性 高级 Python
  • Python高级特性有哪些
    本篇内容介绍了“Python高级特性有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  切片  可以对list, tuple, stri...
    99+
    2023-06-01
  • python动态语言特性小结
    python 动态语言特性  A.动态模块调用 如果模块是动态的, 如从某个配置文件中读取. 那么关于模块的字符串如何转换为代码的import呢, 下面代码很好解释了这一点 例子1 1 sys = __import__('sys') 2...
    99+
    2023-01-31
    小结 特性 语言
  • Python高级特性之---切片操作
    切片操作首先支持下标索引,通过[ N:M :P ]操作 索引正向从0开始,逆向从-1开始N:切片开始位置M:切片结束位置(不包含)P:指定切片步长,为正数表示按照指定步长正向切片,为负数反之一、列表的切片操作列表切片后还是列表通过列表生成器...
    99+
    2023-01-31
    切片 特性 高级
  • python 关于高级特性的问题
      1.函数装饰器有什么作用请列举说明  2. Python 垃圾回收机制  3. 魔法函数 _call_怎么使用  4. 如何判断一个对象是函数还是方法  5. @classmethod 和 @staticmethod 用法和区别  6....
    99+
    2023-01-31
    特性 高级 python
  • Python全面解读高级特性切片
    目录1、切片的基础用法2、切片的高级用法3、自定义对象实现切片功能3.1、魔术方法:`getitem()`3.2、自定义序列实现切片功能3.3、自定义字典实现切片功能4、迭代器实现切...
    99+
    2022-11-12
  • Python中OpenCV Tutorials 20  高动态范围成像的实现步骤
    目录高动态范围成像一、引言二、曝光序列三、代码演示四、解释1. 加载图像和曝光时间2. 估计相机响应3. 形成HDR图像4. 对 HDR 图像进行色调映射5. 实现曝光融合五、补充资...
    99+
    2022-11-11
  • Java高级特性(基础)
    StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都 会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改...
    99+
    2023-05-31
    java高级特性 ava j
  • LINQ高级特性有哪些
    这篇文章将为大家详细讲解有关LINQ高级特性有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。LINQ高级特性之动态查询有这样一个场景:应用程序可能会提供一个用户界面,用户可以使用该用户界面指定一个或多...
    99+
    2023-06-17
  • Java高级特性有哪些
    本篇内容介绍了“Java高级特性有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1List和SetJUC(java.util.concu...
    99+
    2023-06-19
  • PHP中封装性的高级特性
    封装是面向对象编程中非常重要的一个概念,它通过将数据和行为封装在一个对象内部,从而实现了数据的隐藏和保护。PHP作为一门面向对象的语言,也提供了丰富的封装性的高级特性,本文将通过具体的代码示例来介绍这些特性。访问控制(Access Cont...
    99+
    2023-10-21
    PHP编程 封装性 高级特性
  • Python进阶:全面解读高级特性之切片
    导读:切片系列文章连续写了三篇,本文是对它们做的汇总。为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动,如此一来,本文结构的完...
    99+
    2023-01-30
    进阶 切片 特性
  • MySQL高级特性都有哪些
    今天就跟大家聊聊有关MySQL高级特性都有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。概述闲来无事,看了下高性能mysql这本书,其中的一些M...
    99+
    2022-10-19
  • JavaRabbitMQ高级特性详细分析
    目录消息的可靠投递确认模式退回模式Consumer Ack消费端限流TTL(Time To Live)设置某个队列为过期队列设置单独某个消息过期死信队列延迟队列消息的可靠投递 在使用...
    99+
    2022-11-13
    Java RabbitMQ高级特性 Java RabbitMQ
  • redis的高级特性有哪些
    这篇文章主要介绍了redis的高级特性有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Redis(Remote Dictionary S...
    99+
    2022-10-18
  • SpringCloudStream高级特性使用详解
    目录重试消息发送失败的处理消费错误处理自定义MessageHandler类型Endpoint端点Metrics指标ServerlessPartition统一Polling Consu...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作