python学习笔记 day26 反射-----hasattr getattr delattr

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
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9686983.html