Loading

面向对象之反射

【一】反射

【1】什么是反射

  • 反射是一种程序可以判断,取出和修改其本地状态或行为的能力
  • 在python中,反射主要是指通过字符串操作对象属性

【2】Python中的反射

  • 同过字符串的形式操作对象相关的属性
  • python一切皆为对象,都可以使用反射

【二】反射方法

【1】反射方法介绍

  • getatter(object,'name'[default])
    • 获取对象的属性值,如果不存在,可提供默认值
  • hasatter(object,name)
    • 判断对象是否具有指定属性
  • setatter(object,name,value)
    • 设置对象指定属性
  • delatter(object,name)
    • 删除对象指定属性

【2】反射方法使用

(1)引入

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

    def wheel(self):
        print('我有四个轮子')

    def run(self):
        print('我会跑')


car = Car(name='汽车')

print(car.name)
print(car.__dict__)
print(car.__dict__['name'])
print(dir(car))

"""
汽车
{'name': '汽车'}
汽车
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'run', 'wheel']

"""

(2)getatter

  • getatter(object,name[default])
class Car:
    def __init__(self, name):
        self.name = name

    def wheel(self):
        print('我有四个轮子')

    def run(self):
        print('我会跑')


car = Car(name='汽车')

print(getattr(car, 'name')) # 汽车

(3)hasattr

  • hasatter(object,name)
class Car:
    def __init__(self, name):
        self.name = name

    def wheel(self):
        print('我有四个轮子')

    def run(self):
        print('我会跑')


car = Car(name='汽车')

print(hasattr(car, 'name'))  # True
print(hasattr(car, 'x'))  # False

(4)setattr

  • setattr(object,'name',value)
class Car:
    def __init__(self, name):
        self.name = name

    def wheel(self):
        print('我有四个轮子')

    def run(self):
        print('我会跑')


car = Car(name='汽车')

setattr(car, 'name', '迈巴赫')
print(car.name)  # 迈巴赫

(5)delattr

  • delattr(obejct,name)
class Car:
    def __init__(self, name):
        self.name = name

    def wheel(self):
        print('我有四个轮子')

    def run(self):
        print('我会跑')


car = Car(name='汽车')

delattr(car, 'name')

【3】拓展

(1)类也是对象

  • 在Python中一切皆对象,所以类也可以是反射方法中的第一个参数。
class Car:
    def __init__(self, name):
        self.name = name

    def wheel(self):
        print('我有四个轮子')

    def run(self):
        print('我会跑')


print(getattr(Car, 'wheel'))  # <function Car.wheel at 0x000001A5F84B9760>
print(hasattr(Car, 'wheel'))  # True
print(setattr(Car, 'age', 18))  # 返回一个None
print(Car.age)  # 18
delattr(Car, 'wheel')
print(hasattr(Car, 'wheel'))  # False

【三】反射的好处

【1】实现可插拔机制

  • 反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,意味着可以在程序运行过程中动态地绑定接口的实现。
  • 这种灵活性使得程序更容易扩展和维护。
posted @ 2024-01-13 23:22  HuangQiaoqi  阅读(14)  评论(0编辑  收藏  举报