Python中的反射知识点总结

 更新时间:2021年11月19日 08:29:20   作者:J.Feng  
在本篇文章里小编给大家整理了一篇关于Python中的反射知识点总结内容,有需要的朋友们可以跟着学习参考下。

通过字符串映射或修改程序运行时的状态、属性、方法, 可以通过下面这4中方法

''' 
   使用getattr(object, name_str, default=None) 方法获取object对象里
   对应的方法或者属性的内存地址
   如果是属性:直接返回属性值
   如果是方法:返回方法的内存地址     
   '''

# hasattr(object,name_str) 判断object对象是否有一个名为name_str的方法或者属性

代码演示:

# -*- coding:utf8 -*-
class  Person(object):
    def __init__(self, name):
        self.name = name

    def fun(self):
        print("%s正在玩耍" % self.name)

p1 = Person("某人飞")

name_str = input("请输入方法或者属性").strip()
# hasattr(object,name_str) 判断object对象是否有一个名为name_str的方法或者属性
if hasattr(p1, name_str):
   ''' 
   如果有就可以使用getattr(object, name_str, default=None) 方法获取object对象里
   对应的方法或者属性的内存地址
   如果是属性:直接返回属性值
   如果是方法:返回方法的内存地址     
   '''
   print(getattr(p1, name_str , 80))
   # >>>name: 某人飞
   # >>>fun : <bound method Person.fun of <__main__.Person object at 0x0000020B76A81370>>
   # 所以如果是方法,那么可以这么处理
   a = getattr(p1, name_str)
   a()
else:
    print("该对象没有这些属性和方法")

判断和获取的演示

如果对象没有从键盘录入的该方法,那么可以使用,setattr添加一个方法

def bulk(self):
    print("这是在%s对象的类外部创建的方法"%self.name)


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

    def fun1(self):
        print("%s正在玩耍" % self.name)

p1 = Person("某人飞")
name_str = input("请输入您的方法或者属性").strip()
if hasattr(p1, name_str):
    a = getattr(p1, name_str)
    a()
else:  #如果没有这个方法,那么为其创建一个已经存在的方法
    """
    setattr(p1, name_str, bulk)
    为对象p1添加一个已经存在的bulk的方法,命名为name_str
    """
    setattr(p1, name_str, bulk)
    a = getattr(p1, name_str)
    a(p1)
"""
运行结果
请输入您的方法或者属性ui
这是在某人飞对象的类外部创建的方法
"""

setattr(p1, name_str, bulk)添加方法

如果对象没有从键盘录入的该方法,那么可以使用,setattr添加一个属性

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

p1 = Person("某人飞")
name_str = input("请输入您的方法或者属性").strip()
if hasattr(p1, name_str):
    a = getattr(p1, name_str)
    print(a)
    # 也可以同setattr修该已有属性的值
    setattr(p1, name_str, "飞")
    print(p1.name)
else:  #如果没有这个属性,那么为其添加一个属性 ,并为其设置一个默认值20
    setattr(p1, name_str, 20)
    a = getattr(p1, name_str)
    print(a)
"""
运行结果:
请输入您的方法或者属性name
某人飞
飞

运行结果:
请输入您的方法或者属性age
20
"""

setattr(p1, name_str, index)添加属性

删除对象中的属性和方法(其中方法并不能删除

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

    def fun(self):
        print("这是一个实例方法")

p1 = Person("某人飞")
name_str = input("请输入您的方法或者属性").strip()
if hasattr(p1, name_str):
    # 删除这个对象的属性或者方法
    delattr(p1, name_str)
else:
    pass

print(p1.name)
p1.fun()
"""
运行结果:
请输入您的方法或者属性name
AttributeError: 'Person' object has no attribute 'name'

运行结果:
请输入您的方法或者属性fun
AttributeError: fun
"""

delattr(p1, name_str)只能删除属性,和动态添加的方法

注意:通过delattr能够删除通过setattr动态添加的方法,其实也是一个假象。真相是通过setattr添加的一个方法并不是真的给这个对象添加了一个方法,而是添加了一个属性,setattr方法的第二个参数就是这个属性的名字,然后这个属性的值是一个指向外部函数的引用地址,所以当我们调用这个对象的属性时,实际上是间接调用了这个函数,看起来就像是这个对象添加了一个方法一样,但本质上仍然是添加的一个属性。不管是setattr和delattr,其实都只能针对对象的属性进行操作,它们对对象的方法是无法直接操作的。

到此这篇关于Python中的反射知识点总结的文章就介绍到这了,更多相关Python中的反射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 判断一个进程是否存在

    python 判断一个进程是否存在

    判断python判断一个进程是否存在
    2009-04-04
  • Python机器学习NLP自然语言处理基本操作家暴归类

    Python机器学习NLP自然语言处理基本操作家暴归类

    本文是Python机器学习NLP自然语言处理系列文章,带大家开启一段学习自然语言处理 (NLP) 的旅程。本篇文章主要学习NLP自然语言处理家暴归类
    2021-09-09
  • Python字符串与正则表达式详细介绍

    Python字符串与正则表达式详细介绍

    这篇文章主要介绍了Python字符串与正则表达式,Python字符串与正则表达式在Python中具有非常重要的地位,熟练的使用字符串与正则表达式能够为我们的Python编程提供很多的便利之处,希望您阅读完本文后能够有所收获
    2022-01-01
  • 详解Python+OpenCV实现图像二值化

    详解Python+OpenCV实现图像二值化

    图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。本文将通过Python+OpenCV实现这一过程,感兴趣的可以学习一下
    2022-05-05
  • Python爬取网站图片并保存的实现示例

    Python爬取网站图片并保存的实现示例

    这篇文章主要介绍了Python爬取网站图片并保存的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • PyCharm使用Docker镜像搭建Python开发环境

    PyCharm使用Docker镜像搭建Python开发环境

    这篇文章主要介绍了PyCharm使用Docker镜像搭建Python开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)

    利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)

    这篇文章主要给大家介绍了关于利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Python base64编码解码实例

    Python base64编码解码实例

    这篇文章主要介绍了Python base64编码解码实例,本文直接给出实例代码,使用也很简单,需要的朋友可以参考下
    2015-06-06
  • Python爬虫爬取Bilibili弹幕过程解析

    Python爬虫爬取Bilibili弹幕过程解析

    这篇文章主要介绍了Python爬虫爬取Bilibili弹幕过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • python编写接口测试文档(以豆瓣搜索为例)

    python编写接口测试文档(以豆瓣搜索为例)

    接口测试的方式有很多,比如可以用工具(jmeter,postman)之类,也可以自己写代码进行接口测试,这篇文章主要给大家介绍了关于python编写接口测试文档,本文以豆瓣搜索功能为例,需要的朋友可以参考下
    2021-07-07

最新评论