反射(高大上)、类的内置方法

反射

对象的反射

类的反射

模块的反射

本模块的反射:找到本模块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__)

 

posted @ 2017-11-24 13:47  小杜要加油  阅读(230)  评论(0编辑  收藏  举报