zoukankan      html  css  js  c++  java
  • 反射(高大上)、类的内置方法

    反射

    对象的反射

    类的反射

    模块的反射

    本模块的反射:找到本模块sys.modules[__name__]

    python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

    hasattr() 函数用于判断对象是否包含对应的属性。
    getattr() 函数用于返回一个对象属性值。
    setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在。
    delattr 函数用于删除属性。
    delattr(x, 'foobar') 相等于 del x.foobar。
    class Foo:
        f = '类的静态变量'
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
        def say_hi(self):
            print('hi,%s'%self.name)
    
    obj=Foo('egon',73)
    
    #检测是否含有某属性
    print(hasattr(obj,'name'))     #输出结果:True
    print(hasattr(obj,'say_hi'))   #输出结果:True
    
    #获取属性
    n=getattr(obj,'name')
    print(n)   #输出结果:egon
    func=getattr(obj,'say_hi')
    func()   #输出结果:hi,egon
    
    
    #设置属性
    setattr(obj,'sb',True)
    setattr(obj,'show_name',lambda self:self.name+'sb')
    print(obj.__dict__)  
    #输出结果:{'name': 'egon', 'age': 73, 'sb': True, 'show_name': <function <lambda> at 0x00000194A8817048>} print(obj.show_name(obj)) #删除属性 delattr(obj,'age') delattr(obj,'show_name') print(obj.__dict__)
    #输出结果:{'name': 'egon', 'sb': True}
    hasattr(对象名,'属性名')  返回True或False
    属性值 = getattr(对象名,'属性名')
    方法的内存地址 = getattr(对象名,'方法名')
    方法的内存地址()
    getattr 获取属性
    class Management:
        role = '管理员'
        def __init__(self,name,sex,phone,mail):
            self.name = name
            self.sex = sex
            self.phone = phone
            self.mail = mail
    
        def creat_class(self):
            print('新建了一条讲师信息')
    
        def creat_teacher(self):
            print('新建了一条讲师信息')
    
        def creat_student(self):
            print('新建了一条讲师信息')
    
    Management.role
    if hasattr(Management,'role')
        print(getattr(Management,'role'))  # 管理员
    manager = Management('小雨','',111252,'1111@qq.com')
    f = getattr(manager,'creat_class')
    # f()  # 类外加括号
    f = getattr(manager,'sex')# 属性反射 # 使用字符串数据类型的变量名获取属性值
    print(f)  # 类内不用加括号
    # <bound method Management.creat_class of 
    <__main__.Management object at 0x00000000024DD128>>
    # f() # 新建了一条讲师信息 cs = getattr(manager,'creat_class') # 方法反射 cs()

    hasattr 检查是否含有某属性

    # hasattr   getattr 用getattr之前用hasattr,hasattr能检测是否含有某属性
    class Management:
        role = '管理员'
        def __init__(self,name,sex,phone,mail):
            self.name = name
            self.sex = sex
            self.phone = phone
            self.mail = mail
    
        def creat_class(self):
            print('新建了一条讲师信息')
    
        def creat_teacher(self):
            print('新建了一条讲师信息')
    
        def creat_student(self):
            print('新建了一条讲师信息')
    
    import logging
    manager = Management('小雨','',111252,'1111@qq.com')
    if hasattr(manager,'sex1'):  # True
        sex = getattr(manager,'sex1')#  False
        print(sex)
    else:
        logging.warning('没有你输入的属性')

    总结

    class Foo:
        f = '类的静态变量'
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
        def say_hi(self):
            print('hi,%s'%self.name)
    
    obj=Foo('egon',73)
    
    #检测是否含有某属性
    print(hasattr(obj,'name'))
    print(hasattr(obj,'say_hi'))
    
    #获取属性
    n=getattr(obj,'name')
    print(n)
    func=getattr(obj,'say_hi')
    func()
    
    print(getattr(obj,'aaaaaaaa','不存在啊')) #报错
    
    #设置属性
    setattr(obj,'sb',True)
    setattr(obj,'show_name',lambda self:self.name+'sb')
    print(obj.__dict__)
    print(obj.show_name(obj))
    
    #删除属性
    delattr(obj,'age')
    delattr(obj,'show_name')
    delattr(obj,'show_name111')#不存在,则报错
    
    print(obj.__dict__)
    
    
  • 相关阅读:
    Iphone [Tab Bar实现多view切换,Picker,DataPicter实现
    基于socket、多线程的客户端服务器端聊天程序
    C/C++面试题
    Unity3D打Box游戏
    Unity3D项目开发一点经验
    Unity3D使用过程中常见的20个问题
    @property中strong跟weak的区别
    java多线程系列8 高级同步工具(2)CountDownLatch
    java多线程系列7 高级同步工具(1)信号量Semaphore
    java多线程系列6 synchronized 加强版 ReentrantLock
  • 原文地址:https://www.cnblogs.com/jassin-du/p/7890233.html
Copyright © 2011-2022 走看看