python反射
2023-12-28 16:02:14
一、简单列举几个方法
可以点到函数类中查看方法
-
hasattr() 函数用于检查对象是否具有指定的属性或方法
-
getattr() 根据字符串获取对应的变量名或者函数名
-
setattr() 根据字符串给对象设置数据 (名称空间的名字)
-
delattr() 根据字符串删除对象对应的数据 (名称空间中的名字)
-
dir():获取对象的所有属性和方法的列表。可以使用dir()函数来获取对象的所有属性和方法的列表。
-
type():获取对象的类型。可以使用type()函数来获取对象的类型信息。
-
inspect模块:该模块提供了更加高级的反射功能,可以用于获取函数和类的参数列表、注解、源代码等信息。
-
callable() 是一个内置函数,用于检查对象是否可调用。
-
__annotations__用于存储函数的注解信息
二、例子
1、上述文中的例子
1、hasattr() 判断对象是否含有字符串对应的数据或者功能
class Cat:
name='123'
def printagename(self):
print('111')
print(hasattr(Cat(), "name"))
print(hasattr(Cat(), "printagename"))
print(hasattr(Cat(), "123"))
2、getattr() 根据字符串获取对应的变量名或者函数名
class Cat:
name = '123'
def printagename(self):
print('111')
def zzzz(self, value, aaa): # 加上参数 value
print(value + aaa)
# 1.获取类中的值
print(getattr(Cat,'name'))
# 2.获取类中的方法
print(getattr(Cat,'printagename'))
# 3.调用函数
ccc = Cat()
getattr(Cat,'printagename')(ccc) # 这个写法类似于 1、ccc = Cat() 2、method = getattr(Cat,'printagename') 3、method(ccc)
# 4. 如果有参数的函数如何调取
aaa = Cat()
method = getattr(Cat,'zzzz')
method(aaa, "vvv","ccc")
# 5.获取对象中的属性值
print(getattr(ccc,'name'))
运行结果如下
3、 setattr() 根据字符串给对象设置数据 (名称空间的名字)
class Cat():
name='123'
def printagename(self):
print('111')
# 1.获取类中的值
print(getattr(Cat,'name'))
#2.通过反射修改
setattr(Cat,'name','addddd')
#3.获取修改后结果
print(getattr(Cat,'name'))
- delattr() 根据字符串删除对象对应的数据 (名称空间中的名字)
class Cat():
name='123'
def printagename(self):
print('111')
# 1.获取类中的值
print(getattr(Cat,'name'))
#2.通过反射删除
delattr(Cat,'name')
#3.获取修改后结果
print(getattr(Cat,'name'))
- dir():获取对象的所有属性和方法的列表。可以使用dir()函数来获取对象的所有属性和方法的列表。
class MyClass:
def __init__(self):
self.my_attribute = 'Hello, World!'
def my_method(self):
print(self.my_attribute)
# 使用 dir() 获取类的方法列表
print(dir(MyClass))
- type():获取对象的类型。可以使用type()函数来获取对象的类型信息。
class MyClass:
def __init__(self):
self.my_attribute = 'Hello, World!'
def my_method(self):
print(self.my_attribute)
# 使用 dir() 获取类的方法列表
print(type(MyClass))
创建对象
class MyClass:
def __init__(self, x, y):
self.x = x
self.y = y
my_class = type("MyClass", (), {"x": 1, "y": 2})
my_object = my_class()
print(my_object.x, my_object.y) # 输出 1 2
- inspect模块:该模块提供了更加高级的反射功能,可以用于获取函数和类的参数列表、注解、源代码等信息。
import inspect
def greet(name: str, age: int) -> None:
print(f"Hello, {name}! You are {age} years old.")
# 获取函数的签名信息
signature = inspect.signature(greet)
print(signature) # 输出函数的签名信息
# 获取函数参数信息
for param_name, param in signature.parameters.items():
print(f"Parameter: {param_name}, Type: {param.annotation}, Default: {param.default}")
# 判断对象是否为函数
print(inspect.isfunction(greet)) # 输出: True
8、callable() 是一个内置函数,用于检查对象是否可调用。
class MyClass:
def __call__(self):
print("Calling MyClass")
def my_function():
print("Calling my_function")
obj = MyClass()
print(callable(my_function)) # 输出: True,函数是可调用的
print(callable(obj)) # 输出: True,具有 __call__() 方法的对象是可调用的
print(callable(10)) # 输出: False,整数是不可调用的
- __annotations__用于存储函数的注解信息
def greet(name: str, age: int) -> None:
print(f"Hello, {name}. You are {age} years old.")
greet.__annotations__["name"] = 132
print(greet.__annotations__)
三、查看链接实用场景
主要查看他创建对象的方式,以及实用场景(策略者模式)
链接
文章来源:https://blog.csdn.net/weixin_49390750/article/details/135238709
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!