首页 > 编程语言 >Python进阶之反射

Python进阶之反射

时间:2024-05-10 18:55:48浏览次数:17  
标签:反射 进阶 Python res self name student print 属性

【一】什么是反射

  • 反射是一种程序可以访问、检测和修改其本身状态或行为的能力
  • 在 Python 中,反射主要指通过字符串的形式操作对象的属性
  • python中的一切事物都是对象,都可以使用反射

【二】反射方法

  • getattr(object, key):获取对象的属性值,如果属性不存在,可提供默认值
  • hasattr(object, key):判断对象是否具有指定属性
  • setattr(object, key, value):设置对象的属性值和属性名
  • delattr(object, key):删除对象的属性

【三】反射方法的使用

(1)getattr

class Student(object):
    school = '北京大学'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def read(self):
        print(f"{self.age}岁的学生{self.name}的学校是{self.school}")


student = Student('ligo', 18)
#(1)数据属性:在对象中映射数据属性的时候,如果对象中存在当前属性值则直接将属性值拿出来
res = getattr(student, 'name')
print(res)  # ligo
res = getattr(student, 'age')
print(res)  # 18

#(2)函数属性:在对象中映射函数属性的时候,如果对象中存在当前属性名对应的数据属性
# 则直接获取当前函数属性的内存地址,可以直接调用当前函数
res = getattr(student, 'read')
print(res)  # <bound method Student.read of <__main__.Student object at 0x000001E0425549D0>>
res()  # 18岁的学生ligo的学校是北京大学

#(3)如果对象中不存在当前属性名对应的属性,会直接报错
res = getattr(student, 'sex')
print(res)  # AttributeError: 'Student' object has no attribute 'sex'

(2)hasattr

class Student(object):
    school = '北京大学'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def read(self):
        print(f"{self.age}岁的学生{self.name}的学校是{self.school}")


student = Student('ligo', 18)
# (1)数据属性:如果对象中存在当前属性值,则返回True
res = hasattr(student, 'name')
print(res)  # True
res = hasattr(student, 'age')
print(res)  # True

# (2)函数属性:如果对象中存在当前属性名对应的数据属性,则返回True
res = hasattr(student, 'read')
print(res)  # True

# (3)如果对象中不存在当前属性名对应的属性,则返回False
res = hasattr(student, 'sex')
print(res)  # False

(3)setattr

class Student(object):
    school = '北京大学'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def read(self):
        print(f"{self.age}岁的学生{self.name}的学校是{self.school}")


def outer_read():
    print("outer_read")


student = Student('ligo', 18)
# (1)数据属性:向对象中设置属性名和属性值,如果对象中存在当前属性则直接替换,否则新增
res1 = setattr(student, 'name', 'scott')
print(student.name)  # scott
res2 = setattr(student, 'sex', '男')
print(student.sex)  # 男

# (2)在对象中映射函数属性的时候,如果对象中存在当前属性名对应的数据属性,则返回True
print(setattr(student, 'outer_read', outer_read))  # None
print(hasattr(student, 'outer_read'))  # True
print(getattr(student, 'outer_read'))  # <function outer_read at 0x000002B5DFECA7A0>
getattr(student, 'outer_read')()  # outer_read

(4)delattr

class Student(object):
    school = '北京大学'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def read(self):
        print(f"{self.age}岁的学生{self.name}的学校是{self.school}")


student = Student('ligo', 18)
# (1)数据属性:在对象中删除数据属性的时候,如果对象中存在当前属性值则直接删除
print(hasattr(student, 'name'))  # True
delattr(student, 'name')
print(hasattr(student, 'name'))  # False

# (2)在对象中删除函数属性的时候,要根据参数是对象还是类来做区分
print(hasattr(Student, 'read'))  # True
# 如果参数是当前对象,则无法删除函数属性
# res = delattr(student, 'read')
# 如果参数是当前类,则可以删除函数属性
delattr(Student, 'read')
print(hasattr(Student, 'read'))  # False

# (3)如果对象中不存在当前属性名对应的属性,则直接报错
print(delattr(student, 'sex'))  # AttributeError: sex

标签:反射,进阶,Python,res,self,name,student,print,属性
From: https://www.cnblogs.com/ligo6/p/18183501

相关文章

  • Python进阶之内置方法
    【一】内置方法引入__init__ :初始化对象时触发__del__ :删除类时触发__new__ :构造类时触发__str__ :str函数或者print函数触发__repr__ :repr或者交互式解释器触发__doc__ :打印类内的注释内容__enter__ :打开文档触发__exit__ :关闭文档触发__getattr__:访问不存在的属......
  • python 实现类重载(类似C#的类重载,但是远不如C#的类重载好用)
    pipinstallmultipledispatch-ihttps://mirrors.aliyun.com/pypi/simplefrommultipledispatchimportdispatchclassMyClass:ab=11234def__init__(self):self.aa=1@dispatch()defcalculate(self):self.aa=1111......
  • 分享一个使用python调用websocket获取实时行情数据的方法
    这个站点可以获取:外汇、国际期货、国内期货、贵金属、能源、虚拟货币、股指期货、美股、台股、港股、印度股、A股、ETF等以下是Python的连接demo,可以参考下。同时也支持其他后端语言的连接,PHP、Java等。获取品种地址:http://39.107.99.235:1008/market/market.phpimportj......
  • Python进阶之抽象类
    【一】什么是抽象类与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化【二】为什么要有抽象类如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据......
  • Python进阶之封装
    【一】面向对象的三大特性面向对象的三大特性:封装、继承、多态其中最重要的就是封装,封装就是将数据和功能整合到一起我们可以对封装在类和对象中的属性进行访问的控制,有隐藏的和开发的接口【1】什么是封装封装是对具体对象的一种抽象封装就是将某些数据和功能隐藏起来,只......
  • Python-有序字典OrderedDict练习题
    问题:读取键盘输入结果,创建n个键值对,将其排序后放入有序字典并输出。详细描述:根据提示,实现函数功能:读取n(n>0)行输入,以每一行的数据为key,行号(从0开始)为value,建立n对键值对,然后将他们按照key排序后,放入一个有序字典,最后输出这个有序字典。importcollectionsdefFunc():pairs......
  • python教程10-集合
    集合(set)是一个无序的不重复元素序列。集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。可以使用大括号 {} 创建集合,元素之间用逗号 , 分隔,或者也可以使用 set() 函数创建集合。集合创建:注意:创建一个空集合必须用 set() 而不是 {},因为 {} ......
  • python教程10-元祖
    元组(tuple)与列表类似,不同之处在于元组的元素不能修改。因此很少使用元组使用小括号 (),列表使用方括号 [] 元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用:元祖调用:修改元祖元组中的元素值是不允许修改的,但我们可以对元组进行连接组......
  • python异常的一些代码笔记
    点击查看代码whileTrue:try:x=int(input("请输入一个数字:"))print("你输入的数字是:",x)except:print("异常,输入的不是数字:")try:a=input("请输入被除数:")b=input("请输入除数:")c=float(a)/float......
  • 使用Python进行数据分析的基本步骤和技巧
    ......