• 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
  • 相关阅读:
    [转帖]Javascript字符验证代码
    HTML标签转换函数
    [转帖]javascript做浮点数运算精确问题
    页面间参数传递
    js与asp.net的对话
    作死作死,完美主义,又“重写”了
    学习的最大动力是想要更加减少重复性工作
    三种可执行脚本的入门总结1
    [Python学习]遇到阻碍:可以在win平台下使用的unix shell环境
    .bat批处理脚本让cmd命令行提示符cd到工作目录
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9686983.html
Copyright © 2020-2023  润新知