美文网首页PythonPython全栈
27.Python之面向对象的反射

27.Python之面向对象的反射

作者: 免跪姓黄 | 来源:发表于2020-03-11 22:52 被阅读0次

Python之面向对象的反射

  1. 反射的定义

    • 通过字符串来操作类与对象的属性(attribute)、实例变量、绑定方法等操作,称之为反射。
  2. 反射的作用

    • 想通过变量的字符串类型的名字,直接调用变量的时候,就需要用到反射。
  3. 反射语法

    • 以下四个内置函数是专门通过字符串来操作类与对象属性的:

      • hasattr(object, 'name') 函数用于判断name在不在类object中,等同于print('name' in object.__dict__)
      • getattr(object, 'name', None) 函数用于返回一个对象属性值,等于调用 object.name ,如果没有属性或属性没有值,就返回None,一般getattr()会与hasattr()成对出现。
      • setattr(object, 'name_1', 'name_2') 函数用于修改属性的值。
      • delattr(object, 'name') 函数用于删除属性的值。
    • getattr() 语法:

      getattr(object, 'name')
      # object -- 对象。
      # 'name' -- 对象属性的字符串。
      
  1. 反射的使用方法(场景)

    • 反射对象的实例变量和绑定方法

      class User(object):
          '''
          定义一个用户类
          '''
          def __init__(self):
              self.username = '徐凤年'
              self.password = '123'
      
      # 实例化
      user = User()
      
      # 通过内置函数getatter()进行反射
      徐凤年 = getattr(user, 'username')
      print(徐凤年)  # 得到的是self.username的值
      
    • 反射类的属性和方法

      class User(object):
          a = 'Python'
          def __init__(self):
              pass
      
      user = User()
      res = getattr(user, 'a')
      print(res)  # Python
      
    • 反射模块中的所有变量

      from abc import ABCMeta, abstractclassmethod
      import sys
      
      class Payment(metaclass=ABCMeta):
          def __init__(self, name):
              self.name = name
          @abstractclassmethod
          def pay(self):
              pass
      
      class AliPay(Payment):
          def pay(self, amount):
              print(F'{self.name}通过支付宝支付:{amount}元')
      
      class WeChatPay(Payment):
          def pay(self, amount):
              print(F'{self.name}通过微信支付:{amount}元')
      
      class ApplePay(Payment):
          def pay(self, amount):
              print(F'{self.name}通过苹果支付:{amount}元')
      
      # 归一化设计:让调用者不用实例化对象
      def pay(name, payment_method, amount):
          # if payment_method == 'AliPay':
          #     obj = AliPay(name)
          #     obj.pay(amount)
          #
          # elif payment_method == 'WeChatPay':
          #     obj = WeChatPay(name)
          #     obj.pay(amount)
          #
          # elif payment_method == 'ApplePay':
          #     obj = ApplePay(name)
          #     obj.pay(amount)
      
          # 通过反射完成上面的代码:
          if hasattr(sys.modules['__main__'], payment_method):    # 判断是否有paymen,避免报错
              pay_name = getattr(sys.modules['__main__'], payment_method)    # 将字符串类型的payment_method转化成类名称
              if callable(pay_name):  #  判断pay_name是否可调用,避免报错
                  obj = pay_name(name)    # obj = payment_method(name)
                  obj.pay(amount)
      
      
      # 其他程序员调用归一化设计的支付接口
      pay('马云', 'AliPay', 10000)  # 马云通过支付宝成功支付:10000元
      pay('马化腾', 'WeChatPay', 10000)  # 马化腾通过微信成功支付:10000元
      pay('乔布斯', 'ApplePay', 10000)  # 乔布斯通过苹果成功支付:10000元
      

相关文章

  • 27.Python之面向对象的反射

    Python之面向对象的反射 反射的定义通过字符串来操作类与对象的属性(attribute)、实例变量、绑定方法等...

  • PHP反射机制Reflection

    反射机制简介 在面向对象编程中,对象被系统赋予了自省的能力,而实现这个自省的过程就是反射。 ​反射,简单理解就是根...

  • 面向对象:反射,内置方法

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

  • 好程序员web前端学习路线之Javascript面向对象

    好程序员web前端学习路线之Javascript面向对象,面向对象是使用对象,面向对象开发就是使用对象开发。 面向...

  • python 进阶 面向对象(二)

    利用反射查看面向对象成员归属# s1模块 class Foo: country = "Chin...

  • python09-面向对象(二) & 异常

    面向对象 回顾:反射:以字符串的形式去某个对象(模块,类,对象)操作它的成员(python中,一切皆对象)# 从模...

  • Lua-基本语法

    1.基本语法 2.表 3.数组 4.面向对象之复制表的方式面向对象 5.面向对象之函数闭包的方式面向对象

  • 面向对象和面向过程

    1.面向对象:面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之...

  • 那些年出现的作业

    Java面向对象之类的练习之模拟计算器 demo Java面向对象之类的练习之ArrayBox封装 demo

  • 2020-10-31-Java-复习44(java基础知识)

    注意javase 中的对象理解 io流 反射机制 1.java 和 C++ 区别 都是面向对象的语言,都支持封...

网友评论

    本文标题:27.Python之面向对象的反射

    本文链接:https://www.haomeiwen.com/subject/dmmkjhtx.html