python之路:始解(三)

此章涉及到的是反射机制

反射主要涉及到以下方法:

  hasattr、getattr、setattr、delattr

首先说明他们的作用:

  hasattr是用来判断在指定范围内是否存在指定内容的方法

  getattr是用来从指定范围内取出指定内容的方法

  setattr是用来设置指定范围内指定内容的值的方法

  delattr是用来从指定范围内删除指定内容的方法

将这四者串起来的话,首先要从hasattr说起。

  比如:

class Person():
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender
    def talk(self):
        print("%s is talking"%self.name)


d=Person("liu",26,"male")
select=input("请输入要执行的函数:")
if hasattr(d,select)==True:
    print("此类存在")
else:
    print("此类不存在")

  输入talk,则会返回此类存在。

  输入其他值,则会返回此类不存在

用了hasattr判断完对象是否存在之后,我们就可以使用getattr取出该对象,如果该对象是个方法的话,那么就可以直接运行此方法,如果该对象是个参数的话,那么我们就可以直接得到该值。

class Person():
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender
    def talk(self):
        print("%s is talking"%self.name)


d=Person("liu",26,"male")
select=input("请输入要执行的函数:")
if hasattr(d,select)==True:
   getattr(d,select)()
else:
    print("此类不存在")

输出的结果为:

在用getattr找到指定内容后,可能还会涉及到更改其值。如果真的需要更改值,那么就需要到了setattr这个函数。

class Person():
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender
    def talk(self):
        print("%s is talking"%self.name)


d=Person("liu",26,"male")



d.talk()
select=input("请输入要执行的函数:")
if hasattr(d,select)==True:
   setattr(d,"name","zhao")
   getattr(d,select)()
else:
    print("此类不存在")

运行该函数可以得到以下结果:

最后如果想要删除某些内容,可以调用delattr来进行相关内容的删除。

class Person():
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender
    def talk(self):
        print("%s is talking"%self.name)


d=Person("liu",26,"male")
d.talk()
# delattr(d,"age")
d.talk()
print(d.age)
# delattr(d,"name")
d.talk()

按照以上代码运行,最终结果为:

若将注释掉的代码回复,则结果变为:

可以对其进行异常处理:

d=Person("liu",26,"male")
d.talk()
delattr(d,"age")
d.talk()
if hasattr(d,"age")==True:
    print(d.age)
else:
    print("age被删除")
delattr(d,"name")
if hasattr(d,"name"):
    d.talk()
else:
    print("name被删除")

结果就不会涉及报错了:

原文地址:https://www.cnblogs.com/mstzkot/p/7483824.html