python 基础 反射方法

python面向对象中的反射:通过字符串的形式操作对象相关的属性

python中的一切事物都是对象(都可以使用反射)

四个反射相关的函数

-hasattr :判断是否有此变量,返回bool 值

-getattr : 获取属性值或者获取方法变量的地址

-setattr :给类或者对象设置属性或者方法 (用的场合很少,了解即可)

-delattr:  删除类或者对象的属性或方法(用的场合很少,了解即可)

- 反射类的属性和方法

- 反射对象的属性和方法

- 反射模块的属性和方法

1 getattr()

         获取对象/类中的成员

          格式  getattr(对象,'属性名'[成员不存在是的默认值])

          返回值: 成员的值

练习1 获取静态方法和类方法
class Teacher(object):
    #类的静态属性
    dict = {'查看学生的信息':'show_student','查看讲师的信息':'show_teacher'}

    def __init__(self,name,age):
        self.name = name
        self.age = age

    #类方法
    @classmethod
    def func(cls):
        print('类方法')

    #静态方法
    @staticmethod
    def func1():
        print('静态方法')

    def show_student(self):
        print('show_student...')

    def show_teacher(self):
        print('show_teacher...')
#   反射类方法和静态属性
# getattr()方法
#第一个参数是对象(一切皆对象,类也是对象),第二个参数是属性的字符串形式
attr = getattr(Teacher,'dict')
print(attr)         #{'查看学生的信息': 'show_student', '查看讲师的信息': 'show_teacher'}
func = getattr(Teacher,'func')
func()       #类方法

#2获取对象的属性值和普通方法
#获取属性
teacher = Teacher('zs','123')
name = getattr(teacher,'name')
print(name)  #zs
#获取方法
show_student = getattr(teacher,'show_student')
show_student()   #show_student...

2,hasattr()

检测对象/类是否是其中的某个成员

格式hasattr(对象/类,'成员名')

返回值  成员的值

class Teacher(object):
    dict = {'查看学生的信息':'show_student','查看讲师的信息':'show_teacher'}

    def __init__(self,name,age):
        self.name = name
        self.age = age

    @classmethod
    def func(cls):
        print('类方法')

    @staticmethod
    def func1():
        print('静态方法')

    def show_student(self):
        print('show_student...')

    def show_teacher(self):
        print('show_teacher...')

#练习1  判断类中是否有dict1 静态属性
b = hasattr(Teacher,'dict1')
if b :
    getattr(Teacher,'dict1')
else:
    print('没有当前属性')

# 练习2,  根据用户输入的key来调用对应的方法
key = input('请输入>>>>')
teacher = Teacher('zs',10)
b = hasattr(teacher,teacher.dict.get(key,''))
if b:
    func = getattr(teacher,teacher.dict[key])
    func()
else:print('不存在')

setattr()

设置或添加对象/类中的成员

格式:setattr(对象名,‘成员名’,值)

返回值  None

# 练习1,给A类添加静态属性 age 属性
class A(object):
    pass

#给类设置静态属性
setattr(A,'age',10)
print(A.age)

#练习2 :A类的对象添加name属性
a = A()
setattr(a,'name','zs')
print(a.name)

"""
10
zs
"""

delattr()

    删除对象/类中的成员

    格式 delattr(对象,成员)

    返回值  None

# 练习1,给A类添加静态属性 age 属性
class A(object):
    pass

#给类设置静态属性
setattr(A,'age',10)
print(A.age)

#练习2 :A类的对象添加name属性
a = A()
setattr(a,'name','zs')
print(a.name)


# 练习1  删除a对象中的name属性
delattr(a,'name')

# 练习2  删除A类的age属性
delattr(A,'age')

 

1  反射导入模块中的属性,函数,类

第一个参数是模块名称,第二个参数是变量名称

练习1 :反射test模块中的属性  函数  和类 

import test

print(test.day)        #星期1
#反射模块中的属性
print(getattr(test,'day'))  #星期1

#反射模块中的方法
func = getattr(test,'func')
func()           #哈哈哈

#反射模块中的类
A = getattr(test,'A')
a = A()          
a.func1()     #func....
func = getattr(test,'func2')
func('zs')    #name--->>> zs

2反射自己的模块中的属性和函数 ,借助sys模块获取当前模块的名称。
 

练习1 查看当前的所有模块

import sys
#查看所有模块
print(sys.modules)

#练习2  反射当前模块中的name变量。
name= 'zs'
attr = getattr(sys.modules['__main__'],'name')
print(attr)

#练习3  反射当前模块中的函数
#反射函数
def func():
    print('哈哈哈')

fun = getattr(sys.modules['__main__'],'func')
fun()

#注意事项 :如果本模块作为导入模块,模块的名称就不是__main__,
# 因此使用__name__属性动态获取
fun = getattr(sys.modules[__name__],'func')
fun()

3反射内置模块

用法和反射导入模块相同

练习1 反射time模块 和time()函数

import time

print(time.time())
t = getattr(time,'time')
print(t())

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值