内置函数
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)