Python实战之反射hasattr、getattr、setattr、delattr

上一篇:Python实战之class类的详解 点击跳转
目录篇:python相关目录篇 点击跳转
下一篇:Python实战之常见异常以及自定义异常  点击跳转

目录

  • #通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法反射
  • #实战反射
  • #hasattr和getattr的作用
  • #hasattr getattr判断和调用
  • #setattr创建方法
  • #setattr创建更改实例的属性
  • #删除实例属性

#通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法反射

class Xx():
     def method...   
#Xx=类名  method =类方法  obj=实例化的XX类对象  func=函数
hasattr : hasattr(obj, ' method')  #判断ob该实例j继承的类xx里面method的方法

#以下配合hasattr的判断使用:

getattr:getattr(obj, ' method')         #获取obj该实例继承的类xx里面的method方法的内存
              getattr(obj, ' method')()      #执行该类xx里面的method方法
setattr:setattr(obj, method,func)    #obj的继承Xx类如果没有该method方法,就执行函数func(obj)
setattr:setattr(obj, variable,value)  #创建修改obj属性(变量)   obj.xx = yy这种
delattr: delattr(obj. variable)             #删除obj的属性(变量)   ==  del obj.xx

#实战反射

__author__ = "Burgess Zheng"

class Dog(object):
    def __init__(self,name):
         self.name = name

    def eat(self,food):
        print("%s is eating %s.." %(self.name,food))

d = Dog("Xiaoming")
#print(d.eat)#获取d实例的继承类的eat方法内存地址
#print(d.name)#打印d实例的属性name的值  结果:Xiaoming
#del d.name#删除d实例的name属性
#print(d.name)

#hasattr和getattr的作用

'''

choice = input(">>您要做什么:").strip()

print(hasattr(d,choice))#hasattr判断对象是否有该方法 ()第一个:d是对象名

                        #()第2个:是否有该choice方法   choice=手动输入

                        #简单就是hasattr判断d该实例的继承类是否有choice方法 ,如果有返回true,如果没有返回false

print(getattr(d,choice))#getattr 获得对象的方法的内存地址

                        #如:chonice输入的是eat 

                        #getattr(d,eat)==print(d.eat) :获取实例d的eat方法内存地址

getattr(d,choice)()#调用输入的方法的执行结果

                   #getattr(d,eat)()==d.eat() 调用d的继承类的eat方法执行结果

                   #(如果eat方法有参数 如:eat(self,food)  我们就需要 d.eat("xx")

'''


#hasattr getattr判断和调用

'''

choice = input(">>您要做什么:").strip()

if hasattr(d,choice):#假如d实例的继承类有该choice方法 #choice是手动输入 假如:输入eat

    func = getattr(d,choice) #func=getattr(d,eat)

                             #getattr(d,eat)==print(d.eat) 获取实例d的eat方法内存地址

    food = () #由于eat(self,food)需要输入实参

    food =input(">>您的食物:").strip()#输入实参 假如输入:xx

    func(food)        #func==getattr(d,eat)(xx)==d.eat(xx) 调用d的继承类的eat方法执行结果

                      #得出的结果是:

                      # >>您要做什么:eat

                      #>>您的食物:xx

                      #NiuHanYang is eating xx..

'''

 

#setattr创建方法

'''

choice = input(">>您要做什么:").strip()

def bulk(self):

    print("%s is yelling..." %self.name)

#在本地添加一个函数,这样的话如果要创建方法就可以调用该bulk函数


if hasattr(d, choice):

#假如d实例的继承类没有该choice方法 #choice是手动输入 假如:输入talk

#由于没有talk方法 跳到else:

    func = getattr(d, choice)

    func("垃圾")

else:

    setattr(d,choice,bulk)

# setattr:d:实例对象 ,choice:输入的方法名talk,调用bulk函数创建方法

# setattr 创建talk方法(这里也可以比喻成属性),talk的值为bulk函数

    #func = getattr(d,choice) # getattr(d,choice) == d.talk

    #func(d)   # func(d) == d.talk(d)

# 由于函数bulk有形参,所以把实例d自己传过去作为形参

              #试验结果:

              #>> 您要做什么: talk

              #Xiaoming is yelling.

'''

#setattr创建更改实例的属性

'''
choice = input(">>您要做什么:").strip()
if hasattr(d, choice): #假如d实例有name属性  choice是手动输入 假如:输入name
    attr = getattr(d,choice)#getattr(d,choice) == d.name
    print(attr)  # print(attr) == print(d.name) 获取的是d实例的属性name的值
                 #结果:NiuHanYang
    #attr = "xiaoming"  #d.name = "xiaoming" 修改d实例属性name的值
    #print(attr) #结果:xiaoming
    setattr(d,choice,"xiaoming")#也可以用这种方式修改d.实例属性name值
    print(d.name) #结果:Xiaoming

else:   #假如上面输入的是不存在的属性如:money
        # 跳到这里: 自动新增属性
   setattr(d,choice,22)#为实例d增加一个属性money 值为 22
   print(getattr(d,choice))#print(getattr(d,choice))=print(d.money)打印显示d实例的money属性值

              # 试验结果:
              #>>您要做什么:money
              #22
'''

#删除实例属性

choice = input(">>您要做什么:").strip()
if hasattr(d, choice): #假如d实例有name属性  choice是手动输入 假如:输入name
   delattr(d,choice)#delattr(d,name)==del d.name 删除d实例的name属性
   print(d.name)

上一篇:Python实战之class类的详解 点击跳转
目录篇:python相关目录篇 点击跳转
下一篇:Python实战之常见异常以及自定义异常  点击跳转

 

你可能感兴趣的:(Python篇)