1. hasattr getattr 一般连用
比如说我们可能定义一个变量name=‘xuanxuan’ 但是有时候拿到的值是‘name’这种字符串类型的,但是我们知道这个'name'中的name就是我们想要使用的变量,应该怎么获取呢:
hasattr: 查看一个类是否有类属性(静态属性),或者类方法,静态方法;或者查看一个对象是否有对象属性,方法;有的话返回True;
getattr: 获取一个类的类属性(静态属性),类方法,静态方法; 或者获取一个对象的属性,方法等
1. 获取类的类属性,类方法,静态方法
class Teacher(): dic={"查看课程信息":'','查看班级信息':''} # 类属性,静态属性 def __init__(self,name): self.name=name def show_classes(self): print("查看班级信息") def show_courses(self): print("查看课程信息") @classmethod def func(cls): print("这里是类方法") @staticmethod def func2(): print("我就是一个静态方法,被类调用") print(hasattr(Teacher,'dic')) # 查看类Teacher是否有类属性dic if hasattr(Teacher,'dic'): # 在使用getattr获取一个属于某一个类的字符串形式的类属性时,先检查该类属性是否存在 ret=getattr(Teacher,'dic') # 我们知道Teacher有个类属性dic 但是如果我们只能拿到'dic'字符串形式的,那么就可以使用getattr获取该类方法 if hasattr(Teacher,'func'): func=getattr(Teacher,'func') # 使用getattr获取类Teacher的func类方法(使用场景就是这里的func加了‘’变成字符串了,我们想使用getattr获取类Teacher的func方法,就可以把‘func’拿来使用了) func() # 其实这里的func就相当于Teacher.func if hasattr(Teacher,'func2'): # Teacher.func2() 一般都是使用类名调用静态方法,先判断该静态方法是否存在 ret2=getattr(Teacher,'func2') # 由于我们通常拿到的都是字符串类型的,但是我们完全可以使用getattr获取不带引号的内容 ret2() # 个人认为 由getattr(类名,'类中的静态方法')获取的ret2其实相当于 Teacher.func2
运行结果:
2. 获取对象的属性,方法:
class Student(): country='China' # 定义类属性,可以被类名调用(推荐) def __init__(self,name,age,sex): self.name=name # 定义属性,只能被对象调用,属于对象的属性 self.age=age self.sex=sex def get_name(self): # 定义对象的方法,被对象调用(推荐) print("该学生的名字为%s"%self.name) def get_age(self): print("该学生的年龄为:%s"%self.age) @classmethod def func1(cls): print("我是一个类方法,被类名调用,类方法有默认参数cls,表示这个类") @staticmethod def func2(): print("我是一个静态方法,被类名调用") if hasattr(Student,'country'): ret=getattr(Student,'country') print("类Student中的类属性为:",ret) if hasattr(Student,'func1'): ret1=getattr(Student,'func1') print("下面是被类调用的类方法") ret1() if hasattr(Student,'func2'): print("下面是被类调用的静态方法") ret2=getattr(Student,'func2') ret2() print("*************接下来是对象调用属性,对象调用方法**************") student=Student('璇璇',22,'女') if hasattr(student,'name'): # 查看对象student是否含有name属性 ret3=getattr(student,'name') # 可以使用getattr获得一个对象的带有引号的属性,也就是取引号内的属性 print("对象中的属性:",ret3) if hasattr(student,'age'): ret4=getattr(student,'age') print("对象中的属性",ret4) if hasattr(student,'get_name'): ret5=getattr(student,'get_name') ret5() if hasattr(student,'get_age'): ret6=getattr(student,"get_age") ret6()
运行结果:
最后再来举一个例子:
class Teacher(): dic={"查看班级信息":'show_class','查看课程信息':"show_course"} def __init__(self,name): self.name=name def show_class(self): print("展示班级信息") def show_course(self): print("展示课程信息") alex=Teacher("alex") for key in alex.dic: print(key) k=input("请选择:>>>") if hasattr(alex,alex.dic[k]):
运行结果: