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

面向对象之反射

时间:2024-01-13 23:35:18浏览次数:23  
标签:__ 反射 name Car self 面向对象 print def

【一】反射

【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】实现可插拔机制

  • 反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,意味着可以在程序运行过程中动态地绑定接口的实现。
  • 这种灵活性使得程序更容易扩展和维护。

标签:__,反射,name,Car,self,面向对象,print,def
From: https://www.cnblogs.com/Hqqqq/p/17963204

相关文章

  • 面向对象之绑定方法和非绑定方法
    【一】绑定方法与非绑定方法介绍【1】绑定方法绑定给谁,谁调用就将谁作为第一个参数传入(1)绑定到类的方法使用classmethod装饰器来装饰将类作为第一个参数传入对象也可调用,会将实例化对象的类作为第一个参数传入(2)绑定到对象的方法通过对象.方法的方法实现,将对象作为......
  • 面向对象之元类
    【一】常用的魔法方法【1】初始化对象的属性__init__【二】元类【1】什么是元类一切源于一句话:Python中一切皆对象八大基本数据类型是对象类实例化得到的对象也是对象其实类本身也是一种对象classHuman:def__init__(self,name,age):self.name=name......
  • 面向对象之封装
    【一】面向对象三大特性面向对象编程有三大特性:封装、继承、多态其中最重要的一个特性就是封装。封装指的就是把数据与功能都整合到一起【1】什么是封装就是对具体对象的一种抽象简单理解就是把不想让别人看到的对象藏起来【2】为什么要封装有些敏感数据不想......
  • 什么是面向对象
    面向过程&面向对象面向过程思想按顺序进行,线性思维步骤清晰简单,第一步做什么,第二步做什么……面对过程适合处理一些较为简单的问题面向对象思想属性加方法变成一个类物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最......
  • Python面向对象之反射
    【一】反射【1】什么是反射反射是一种程序可以访问、检测和修改其本身状态或行为的能力。在Python中,反射主要指通过字符串的形式操作对象的属性。【2】Python中的反射通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)【二】反射方法......
  • Python面向对象之派生
    派生【一】概要"派生"(Derivation)是指在面向对象编程中,通过创建新的类,基于已有的类(通常称为父类或基类)来构建新的类,以获取和扩展父类的属性和方法。在这个过程中,新创建的类称为子类或派生类。通俗来讲,派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法【......
  • 面向对象的三大特性及派生和组合
    面向对象的三大特性面向对象编程有三大特性:封装、继承、多态-->派生和组合【一】封装【1】什么是封装在程序设计中,封装(Encapsulation)是对具体对象的一种抽象封装就是对具体对象的一种抽象简单理解就是将不想让别人看到的东西全部藏起来【2】为什么要封装封装数......
  • java基础语法面向对象之单个对象内存图
    一:概述在面向对象的学习中,需要去了解对象的内存图,在这里以单个对象的内存图为例进行讲解。二:具体说明<1>代码publicclassStudent{Stringname;intage;publicvoidstudy(){System.out.println(name+"好好学习");......
  • Python面向对象之绑定方法和非绑定方法
    绑定方法与非绑定方法【一】概要在Python中,绑定方法是指将类的实例与类的方法关联起来的过程。绑定方法包含类实例作为第一个参数,通常被称为self。当通过实例调用类的方法时,Python会自动传递实例作为第一个参数,这个过程就是方法绑定。【二】常用方法【1】绑定方法(动态方......
  • 29-Scala-面向对象
    1.面向对象编程基础1.1定义类基本语法:[修饰符]class类名{//code}Scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public)一个Scala源文件可以包含多个类1.2成员变量属性的定义语法同变量:[访问修饰符]var属性名称[:类型]=属性值......