• 面向对象之反射


    反射的四个相关方法:

     1  1 #Author : Kelvin
     2  2 #Date : 2019/1/17 20:15
     3  3 
     4  4 # hasattr  setattr  getattr  delattr
     5  5 class People:
     6  6     def __init__(self,name,addr):
     7  7         self.name=name
     8  8         self.addr=addr
     9  9     def eat(self):
    10 10         print("%s 在吃饭..."%self.name)
    11 11     def run(self):
    12 12         print("%s 在跑步..."%self.name)
    13 13 
    14 14 p=People("kelvin","安徽灵璧")
    15 15 print(hasattr(p,"name"))  #查看对象是否有指定属性和方法,返回值类型为bool型
    16 16 print(hasattr(p,"eat"))
    17 17 print(hasattr(p,"run"))
    18 18 #>>>: True
    19 19 #>>>: True
    20 20 #>>>: True
    21 21 
    22 22 print(getattr(p,"name"))  #获取对象的指定属性值
    23 23 #>>>: kelvin
    24 24 print(getattr(p,"eat"))   #获取对象的指定方法内存地址
    25 25 #>>>: <bound method People.eat of <__main__.People object at 0x000001A143506198>>
    26 26 print(getattr(p,"eat1","该属性不存在!"))  #获取指定对象的属性或方法,如果该属性或者方法不存在,则返回第三个参数的值(默认参数)
    27 27 func=getattr(p,"eat")
    28 28 func()
    29 29 #>>>: kelvin 在吃饭...
    30 30 
    31 31 setattr(p,"age","22")  #给对象设置一个属性值
    32 32 print(p.__dict__)
    33 33 #>>>: {'name': 'kelvin', 'addr': '安徽灵璧', 'age': '22'}
    34 34 setattr(p,"name","bob")  #如果设置的属性相同,则代表更新该属性值
    35 35 print(p.__dict__)
    36 36 #>>>: {'name': 'bob', 'addr': '安徽灵璧', 'age': '22'}
    37 37 setattr(p,"func",lambda self:self.name+" is sb") #给对象设置一个函数
    38 38 print(p.__dict__)
    39 39 print(p.func(p))
    40 40 
    41 41 def func1():
    42 42     return "设置的func1方法!"
    43 43 setattr(p,"func1",func1)   #也可以设置一个已经定义的函数名进去
    44 44 print(p.__dict__)
    45 45 print(p.func1())
    46 46 
    47 47 delattr(p,"age")  #删除该对象的属性值
    48 48 print(p.__dict__)
    49 49 #>>>: {'name': 'bob', 'addr': '安徽灵璧'}

    反射的应用实例:

    如果员工1和员工2 分别做一个工作,此时员工1 有事耽误了进程,员工2可以使用反射来判断员工1是否已经实现了指定的功能,如果没实现则继续实现自己的业务代码。

     1 #Author : Kelvin
     2 #Date : 2019/1/18 20:11
     3 
     4 #员工一的工作
     5 class People:
     6     def __init__(self,name,age):
     7         self.name=name
     8         self.age=age
     9     # def eat(self):
    10     #     print("%s 在吃饭..."%self.name)
    11     
    12 #员工二的工作
    13 p=People("kelvin",22)
    14 if hasattr(p,"eat"):
    15     p.eat()
    16 else:
    17     print("执行员工2自己的工作!")

    双下划綫的attr方法:

     1 #Author : Kelvin
     2 #Date : 2019/1/18 20:45
     3 class People:
     4     x=10
     5     def __init__(self,name):
     6         self.name=name
     7     def __getattr__(self, item):
     8         print("__getattr__方法被执行了!")
     9     def __setattr__(self, key, value):
    10         print("__setattr__方法被执行了!")
    11         self.__dict__[key]=value
    12     def __delattr__(self, item):
    13         print("__delattr__方法被执行了!")
    14         self.__dict__.pop(item)
    15 
    16 p=People("kelvin")
    17 print(p.x)  #对象调用已经存在的成员时,不会执行内置的__getattr__方法
    18 print(p.y)  #对象调用不存在的成员时,会执行内置的__getattr__方法
    19 
    20 p.r=6  #对象添加属性时会触发__setattr__方法
    21 p.x=12  #对象修改属性时会触发__setattr__方法
    22 print(p.__dict__)
    23 
    24 del p.x  ##对象删除属性时会触发__delattr__方法
    25 print(p.__dict__)
  • 相关阅读:
    压缩打包linux 文件压缩解压命令Strut2教程java教程
    【leetcode】Valid Parentheses
    指向数据个人对指针的理解,欢迎大家批评Strut2教程java教程
    UML中的用例图
    Extjs4中组件的查找方式
    Extjs中选择组件、选择元素的方法
    [转载]C 内存管理详解
    C开发机顶盒实战代码之队列
    C机顶盒开发实战常用初始化类型:数组、结构、指针
    [转载]C语言链表的建立、插入和删除
  • 原文地址:https://www.cnblogs.com/sun-10387834/p/10284597.html
Copyright © 2020-2023  润新知