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]):
运行结果:
talk is cheap,show me the code