"""反射总结
# 1.需要有一个对象 对象都是有地址的 (不能是基本数据类型)
# 2.对象可以使用 对象.函数/属性就可以使用反射
"""
# class A(object):
# sky = 1
#
# def __init__(self, name):
# self.name = name
#
# def func(self):
# print("is me func")
#
#
# a = A("phil")
# b = input("输入执行的函数:") # b 输入func
#
# # hasattr() getattr等都是调用父类的方法
#
# # getattr(a, b)()
"""使用方法一(推荐)"""
# if hasattr(a, b): # 判断属性是否存在,返回的是布尔值 存在true 不存在false
# print(a.__dict__)
# print(A.__dict__)
# print(getattr(a, b)) # 不是函数不用加括号 如sky
# # getattr(a, b)() # 函数加括号
# else:
# print("没有值")
"""使用方法二(不推荐)"""
# if getattr(a,b,None): # 从a的对象空间里获取b 然后再到类A空间里找 都找不到b返回none
# pass
# else:
# print("没有值")
# 四件套不需要重写
# hasattr(对象名,字符串的属性名) # 作用判断对象是否存在 对象空间里都都是键值对 需要字符串 存在true 不存在false
# hasattr(a,"name")
# getattr(对象名,要获取的属性以字符串形式写,找不到时的提示语句)
# getattr(a, "name", "没有")
# setattr(对象名,要设置的属性名必须以字符串的形式写,要设置的值)
# setattr(a,"age",19)
# delattr(对象名,要删除的属性名必须以字符串的形式写)
# delattr(a,"name")
"""反射总结"""
# 1.需要有一个对象 对象都是有地址的
# 2.对象可以使用 对象.函数/属性就可以使用反射
# case1 把下面列表由小到大进行排序
# my_list = [13, 4, 100, 456]
# if hasattr(my_list, "sort"):
# getattr(my_list, "sort")()
# print(my_list) # [4, 13, 100, 456]
#
# else:
# print("没找到")
# case2 执行没有类的两个函数
def func():
print(1)
def foo():
print(2)
import sys
print(sys.modules)
print(sys.modules[__name__])
obj = sys.modules[__name__] # 得到这个py文件对象
obj.func() # 结果 1
if hasattr(obj,"func"):
getattr(obj, "func")() # 结果 1
else:
print("没找到")
# case 3 导的包也是对象 python中一切皆对象
import time
if hasattr(time,"time"):
print(getattr(time,"time")())
else:
print("无")
python 反射
于 2022-02-13 01:56:59 首次发布