• 面向对象之反射


    反射的四个相关方法:

     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__)
  • 相关阅读:
    UVa 1451 Average (斜率优化)
    POJ 1160 Post Office (四边形不等式优化DP)
    HDU 3507 Print Article (斜率DP)
    LightOJ 1427 Substring Frequency (II) (AC自动机)
    UVa 10245 The Closest Pair Problem (分治)
    POJ 1741 Tree (树分治)
    HDU 3487 Play with Chain (Splay)
    POJ 2828 Buy Tickets (线段树)
    HDU 3723 Delta Wave (高精度+calelan数)
    UVa 1625 Color Length (DP)
  • 原文地址:https://www.cnblogs.com/sun-10387834/p/10284597.html
Copyright © 2020-2023  润新知