• 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
  • 相关阅读:
    Ext.form.TextField组件
    provider: SQL Network Interfaces, error: 26 Error Locating Server/Instance Specified解决办法
    SQL Server访问远程数据库和Linked Server
    C#程序实现动态调用DLL的研究
    把DLL文件打包进EXE的技巧
    C#读取媒体信息
    C# 集合类
    Server Application Unavailable 【Failed to execute request because the AppDomain could not be created.】的解决办法
    比较全的字符串验证类
    如何用VS2005制作Web安装程序
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9686983.html
Copyright © 2020-2023  润新知