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中的反射内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python光学仿真实现光线追迹折射与反射的实现

    目录 折射与反射 平面反射 平面折射 python实现 弧面问题 折射与反射 光线与光学元件相互作用,无非只有两件事,反射和透射.而就目前看来,我们所常用的光学元件,也无非有两种表面,即平面和球面,二维化之后就简化成了射线与线段,射线与劣弧的关系. 平面反射 无论从哪个角度来看,平面的反射折射都要比球面更简单,而反射问题要比折射问题更简单,所以,我们首先处理平面的反射问题. 反射定律即入射角等于反射角,心念及此,最为循规蹈矩的思路必然是先找到入射光线和平面的夹角,然后用这个夹角和平面(在二维空间

  • 小结Python的反射机制

    前言: 前两天用Python实现了ftp服务器.在小项目中就用到了反射.因此写个笔记巩固下. 反射的定义:检测和修改它本身状态或行为的一种能力(自省). 而通过反射,Python可以通过字符串的映射或修改程序运行的状态和方法. 反射的四个方法.hasattr,getattr,setattr,delattr hasattr:判断一个方法是否存在与这个类中 class Person(object): def __init__(self,name): self.name = name def talk

  • Python反射机制实例讲解

    目录 1. 反射的四个函数 2. 类的反射操作 3. 当前模块的反射操作 4. 其他模块反射操作 5. 反射应用场景之一 6. 反射应用场景之二 7. 总结 通常,我们操作对象的属性或者方法时,是通过点"."操作符进行的.例如下面的代码: class Person: type = "mammal" def __init__(self, name): self.name = name def say_hi(self): print('Hello, my name is

  • Python自省及反射原理实例详解

    Python中的自省与反射 由于Python是一门强类型的动态解释型语言,故我们在某些时候并不会知道(特别是与别人对接开发工作的时候)对象中具有的属性与方法. 这个时候我们并不能直接通过 .或者查看底层的 __dict__ 方法来获得该对象下的属性与方法,我们需要使用一种更文明的方式来获取该对象下的属性与方法,故这种文明的方式被称之为反射. 自省和反射是两个比较专业化的术语,首先自省是获取对象的能力,而反射是操纵对象的能力. Python中使用delattr()和setattr()实现反射,而其

  • Python异常处理与反射相关问题总结

    一.异常处理 在程序开发中如果遇到一些 不可预知的错误 或 你懒得做一些判断 时,可以选择用异常处理来做. import requests while True: url = input("请输入要下载网页地址:") res = requests.get(url=url) with open('content.txt', mode='wb') as f: f.write(res.content) 上述下载视频的代码在正常情况下可以运行,但如果遇到网络出问题,那么此时程序就会报错无法正常

  • Python中的反射知识点总结

    通过字符串映射或修改程序运行时的状态.属性.方法, 可以通过下面这4中方法 ''' 使用getattr(object, name_str, default=None) 方法获取object对象里 对应的方法或者属性的内存地址 如果是属性:直接返回属性值 如果是方法:返回方法的内存地址 ''' # hasattr(object,name_str) 判断object对象是否有一个名为name_str的方法或者属性 代码演示: # -*- coding:utf8 -*- class Person(ob

  • python中shell执行知识点

    os.system system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果.这个方法比较适用于外部程序没有输出结果的情况. import os os.system('ls') commands.getstatusoutput 使用commands模块的getoutput方法,这种方法同popend的区别在于popen返回的是一个文件句柄,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些. 主要方法: commands.getstatusoutput(cmd)

  • python中count函数知识点浅析

    python中,count函数的作用是进行python中的数量计算.count函数用于统计字符串.列表或元祖中某个字符出现的次数,是一个很好用的统计函数.具体介绍请看本文. 1.count函数 统计列表ls中value元素出现的次数 2.语法 str.count("char", start,end) 或 str.count("char") -> int 返回整数 3.参数 str -- 为要统计的字符(可以是单字符,也可以是多字符). star -- 为索引字

  • python中re模块知识点总结

    一.什么是正则表达式? 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 二.正则表达式的匹配规则 1.表示字符 ·:匹配任意除换行符'\n'外的字符,但是在DOTALL模式中也可以匹配换行符'\n' \:转义字符,使后一个字符改变原来的意思,如果字符串中想匹配*,可

  • python中HTMLParser模块知识点总结

    本章内容,我们主要来讲一下Python内置的HTML解析库HTMLParser模块,基本上也是应用于页面抓取上,假设,我们需要去收集页面上已存在的静态链接,但是页面肯定代码量都非常大,并且页面也很多,这样看来,会比较麻烦,工作量也非常大,这个时候,我们就可以用到htmlparser模块,一起来了解具体使用内容. 安装: npm install htmlparser htmlparser提供构造函数: function Parser(handler) { this._handler = handl

  • python中__init__方法知识点详解

    目录 介绍__init__方法的作用 讲解__init__方法的语法 演示如何在类中使用__init__方法初始化类的属性 讲解如何使用__init__方法给对象动态添加属性 __init__方法的多态特性 __init__和super的用法 提醒注意事项 总结 介绍__init__方法的作用 __init__ 方法是 Python 中面向对象编程中类的特殊方法,也称为构造方法,当创建一个类的实例时,__init__ 方法会自动调用. 它的主要作用是初始化实例的属性,在实例被创建后,你可以通过这

  • 复习Python中的字符串知识点

    字符串 在 Python 中创建字符串对象非常容易.只要将所需的文本放入一对引号中,就完成了一个新字符串的创建(参见清单 1).如果稍加思考的话,您可能会感到有些困惑.毕竟,有两类可以使用的引号:单引号 (') 和双引号 (").幸运的是,Python 再一次使这种问题迎刃而解.您可以使用任意一类引号来表示 Python 中的字符串,只要引号一致就行.如果字符串是以单引号开始,那么必须以单引号结束,反之亦然.如果不遵循这一规则,则会出现 SyntaxError 异常. 清单 1. 在 Pytho

  • Python中的列表知识点汇总

    Python list 在介绍 Python tuple 时,我使用了类比的方法,将其比做一个袋子,您可以在袋子中存放不同的东西.Python list 与此非常类似,因此,它的功能与袋子的功能也非常类似.但有一点是不同的,即您可以使用方括号创建 list,如清单 1 所示. 清单 1. 在 Python 中创建一个 list >>> l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8,

  • Python中的引用知识点总结

    本篇介绍Python中的引用. 首先想一想如图示例. 在python中,值是靠引用来传递来的. 用id()来判断两个变量是否为同一个值的引用.如图. 图解引用.如图. 可变类型与不可变类型.如图.

  • 实例讲解python中的序列化知识点

    在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收.如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'. 我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshal

随机推荐