笔记:python基础之面向对象进阶——反射

内置函数
isinstance(obj,cls)→检查是否obj是否是类cls的对象;
issubclass(sub,super)→检查sub类是否是super类的派生类。

反射 : 是用字符串类型的名字 去操作 变量
eval也能通过字符串来操作,但是存在安全隐患。

name = 1
eval('print(name)')

反射 就没有安全问题
反射 : 是用字符串类型的名字 去操作 变量
反射对象中的属性和方法: hasattr ,getattr, setattr ,delattr
getattr
反射对象的属性和反射对象的方法。
getattr(类名,‘属性名’)=类名.属性名
getattr(类名,‘方法名’)=类名.方法名()

class A:
    def func(self):
        print('in func')
a = A()
a.name = 'alex'
a.age = 63
# 反射对象的属性
ret = getattr(a,'name')  # 通过变量名的字符串形式取到的值
print(ret)
print(a.__dict__)
变量名 = input('>>>')   # func
print(getattr(a,变量名))
print(a.__dict__[变量名])#变量名一定为A的属性名

#反射对象的方法
a.func()
ret = getattr(a,'func')
ret()

getattr和hasattr组合:

 #组合模式
 if hasattr(对象,‘方法名’):
    			getattr(对象,‘方法名’)
class A:
    price = 20
    @classmethod
    def func(cls):
        print('in func')
# 反射类的属性
# A.price
print(getattr(A,'price'))
# 反射类的方法 :classmethod staticmethod
# A.func()
if hasattr(A,'func'):
    getattr(A,'func')()
    #返回函数,再运行函数

#输出:
20
in func
import time
typ=input('请输入需要查找的内容:')
if hasattr(time,typ):
    print(getattr(time,typ)())
#输出:
请输入需要查找的内容:ctime
Thu Jan 10 16:20:18 2019

模块

import  模块
# 反射模块的属性
模块.属性名=getattr(模块,‘属性名’)

#反射模块的方法
getattr(模块,'方法名')()

内置模块也能用

import time
print(getattr(time,'time')())
print(getattr(time,'asctime')())

#输出:
1547107558.4777365
Thu Jan 10 16:05:58 2019

模块方法需要传参数:getattr(模块,‘方法’)(参数)

import time
print(time.strftime('%Y-%m-%d %H:%M:S'))
print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))
#输出:
2019-01-10 16:07:S
2019-01-10 16:07:S

反射自己模块中的变量/函数

getattr(sys.modules['__main__'/'__name__'],函数名/变量名)

重点是:找到自己模块名

def qqxing():
    print('qqxing')
year = 2018
import sys
print(sys.modules['__main__'].year)
# 反射自己模块中的变量
print(getattr(sys.modules['__main__'],'year'))

# 反射自己模块中的函数
# getattr(sys.modules['__main__'],'qqxing')()
变量名 = input('>>>')
print(getattr(sys.modules[__name__],变量名)())

#输出:
2018
2018
>>>qqxing
qqxing
None

setattr设置修改变量(慎用,少用)
setattr(类名,‘属性名’,‘属性值’)
setattr(对象名,‘属性名’,‘属性值’)

class A:
    pass
a = A()
setattr(a,'name','nezha')
setattr(A,'name','alex')
print(A.name)
print(a.name)

#输出:
alex
nezha

delattr删除(慎用,少用)
delattr(类名,‘属性名’)
delattr(对象名,‘属性名’)

#承接上一个例子
delattr(a,'name')
print(a.name)
delattr(A,'name')
print(a.name)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值