首页 > 其他分享 >面相对象之反射

面相对象之反射

时间:2024-01-29 14:58:11浏览次数:21  
标签:反射 name people 对象 age object print 面相 self

面相对象之反射

一、什么是反射

  • Python中的反射:
    • 通过字符串的形式操作对象相关的属性。
    • python中的一切事物都是对象(都可以使用反射)

二、反射方法

[1]四种反射方法

  1. 获取对象的属性值,如果属性值不存在可以设定默认值
    • getattr(object, name[, default])
  2. 判断对象是否具有指定属性
    • hasattr(object, name)
  3. 设置对象的属性值
    • setattr(object, name, value)
  4. 删除对象的属性
    • delattr(object, name)

[2]放射方法的使用

(1)获取对象的属性值,如果属性值不存在可以设定默认值

  • getattr(object, name[, default])
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


people = Person('Xanadu', 22)
print(getattr(people, 'name', None))  # Xanadu
print(getattr(people, 'age', None))  # 22
# 设定了默认值之后取不到值会返回默认值
print(getattr(people, 'sex', None))  # None

(2)判断对象是否具有指定属性

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


people = Person('Xanadu', 22)
# 有相应属性返回True
print(hasattr(people, 'name'))  # True
print(hasattr(people, 'age'))  # True
# 无相应属性返回False
print(hasattr(people, 'sex'))  # False

(3)设置对象的属性值

  • setattr(object, name, value)
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


people = Person('Xanadu', 22)
# 有相应属性修改相应属性
setattr(people, 'name', 'bridge')
print(people.name)  # bridge
setattr(people, 'age', 18)
print(people.age)  # 18
# 没有相应属性就添加相应属性
setattr(people, 'sex', 'male')
print(people.sex)  # male

(4)删除对象的属性

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


people = Person('Xanadu', 22)

print(people.age)  # 22
delattr(people, age)
print(people.age)  # NameError: name 'age' is not defined

三、拓展

(1)类也是对象

class Student(object):
    school = '希望小学'

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

    def attend_class(self):
        print(f'{self.name}可以上课。')


# 类中的数据属性和函数属性也可以使用反射方法进行判断等操作
print(hasattr(Student, 'school'))  # True
print(hasattr(Student, 'name'))  # False
print(hasattr(Student, 'attend_class'))  # True

(2)反射当前模块成员

import sys


def func_1():
    ...


def func_2():
    ...


there_module = sys.modules[__name__]

print(hasattr(there_module, 'func_1'))  # True
print(getattr(there_module, 'func_2'))  # <function func_2 at 0x00000247A9AB28C0>

四、反射的好处

  • 反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,意味着可以在程序运行过程中动态地绑定接口的实现。
  • 这种灵活性使得程序更容易扩展和维护。
  • 大白话就是可以在使用接口前判断接口是否存在并执行不同的后续代码
class MainInterface(object):
    def run(self):
        ...


class Interface1(MainInterface):
    def run(self):
        print('执行接口一')


class Interface2(MainInterface):
    def run(self):
        print('执行接口二')


def run_interface(interface):
    interface.run()


interface_input = input("请输入想要实现的接口:")

# 从全局名称空间中获取接口名字对应的类
interface_class = globals().get(interface_input)

# 判断是否存在该接口
if interface_class and issubclass(interface_class, MainInterface):
    run_interface(interface_class())
else:
    print('接口不存在')


'''
请输入想要实现的接口:Interface2
执行接口二
'''
'''
请输入想要实现的接口:111
接口不存在
'''

标签:反射,name,people,对象,age,object,print,面相,self
From: https://www.cnblogs.com/taoyuanshi/p/17994493

相关文章

  • 面相对象之多态和鸭子类型
    面相对象之多态和鸭子类型多态指的是一类事物有多种形态一、多态动态绑定(多态性)多态动态绑定在继承的背景下使用时,有时也称为多态性多态性是指在不考虑实例类型的情况下使用实例在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息不同的对象在接收......
  • 面向对象之元类
    面向对象之元类一、什么是元类产生已知类的类就叫做元类,typeclassPerson(object):...deffunc():...people=Person()#产生对象的是类print(type(people))#<class'__main__.Person'>print(type(func))#<class'function'>#产生类的就是元类p......
  • 面向对象之内置方法
    面向对象之内置方法​Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发__init__ :初始化类时触发__del__ :删除类时触发__new__ :构造类时触发__str__ :str函数或者print函数触发__......
  • 面向对象之派生和组合
    面向对象之派生和组合派生派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法一、派生的方法子类是必须要派生出自己的数据属性不然就无数据属性可用子类无法使用父类中__init__定义的属性classPerson(object):def__init__(self,name,age......
  • 【干货】一文掌握JavaScript检查对象空值的N种技巧!
    在开发JavaScript应用程序时,经常需要检查对象是否为空。这是因为在处理和操作对象数据时,我们需要确保对象包含有效的值或属性。以下是一些常见情况,我们需要检查JavaScript对象是否为空:防止空引用错误:当我们尝试访问或使用一个空对象时,可能会导致空引用错误(如TypeError:Cann......
  • 【干货】一文掌握JavaScript检查对象空值的N种技巧!
    在开发JavaScript应用程序时,经常需要检查对象是否为空。这是因为在处理和操作对象数据时,我们需要确保对象包含有效的值或属性。以下是一些常见情况,我们需要检查JavaScript对象是否为空:防止空引用错误:当我们尝试访问或使用一个空对象时,可能会导致空引用错误(如TypeError:Can......
  • net8 对接webapi接口通过 GetFromJsonAsAsyncEnumerable方法直接得到对象,无需进行反序
    调用API直接获取到对象现在有一个接口返回如下图中的数据:如果是在8以前的版本中获取该接口的数据,需要先获取到接口内容,然后进行反序列化,代码如下conststringRequestUri="http://localhost:5145/user";usingvarclient=newHttpClient();varstream=awaitclient......
  • JVM对象创建与内存分配
    对象创建流程对象内存分配对象内存分配流程图对象栈上分配我们通过JVM内存分配可以知道JAVA中的对象都是在堆上进行分配,当对象没有被引用的时候,需要依靠GC进行回收内存,如果对象数量较多的时候,会给GC带来较大压力,也间接影响了应用的性能。为了减少临时对象在堆内分配的数量,JV......
  • C#对象二进制序列化优化:位域技术实现极限压缩
    目录1.引言2.优化过程2.1.进程对象定义与初步分析2.2.排除Json序列化2.3.使用BinaryWriter进行二进制序列化2.4.数据类型调整2.5.再次数据类型调整与位域优化3.优化效果与总结1.引言在操作系统中,进程信息对于系统监控和性能分析至关重要。假设我们需要开发一个监控程序,该......
  • 面向对象基础 成员变量、成员方法、构造方法、this关键字、静态字段、静态方法..
    成员变量与局部变量的区别:  1.作用域:成员变量作用于整个类,局部变量只作用于它所属的范围(函数、语句)  2.生命周期&位置:成员变量存储在堆内存中,是属于对象的,随着对象存在消失。局部变量存储在栈内存中,是属于他所属的范围的,使用完自动释放。  3.初始值:成员变量有默认初始......