又叫做反射函数
万物皆对象(整数、字符串、函数、模块、类等等)
万物皆对象(整数、字符串、函数、模块、类等等)
万物皆对象(整数、字符串、函数、模块、类等等)
这里提到的对象都是大概念的对象
hassttr
hasattr(object, str)
判断对象是否有相应的属性或者方法
第一个参数是对象,第二个参数属性或者方法的字符串
返回值为bool
值,有则True
,无则False
注意:类无法找到实例属性
class A:
name = "bruce"
def __init__(self):
self.age = 18
def eat(self):
print(f"{self.name}eating")
# 查看类是否具有相应属性和方法
print(hasattr(A, "name")) # True
print(hasattr(A, "age")) # False
print(hasattr(A, "eat")) # True
# 查看对象是否具有相应属性和方法
a = A()
print(hasattr(a, "name")) # True
print(hasattr(a, "age")) # True
print(hasattr(a, "eat")) # True
getattr
hasattr(object, name[, default])
获取对象的属性或者方法
第一个参数是对象,第二个参数属性或者方法的字符串,第三个参数是找不到返回的默认值
返回值为属性或者方法或默认值,找不到也没有默认值会报错
class A:
name = "bruce"
def __init__(self):
self.age = 18
def eat(self):
print(f"{self.name} is eating")
a = A()
print(getattr(a, "name")) # bruce
print(getattr(a, "age")) # bruce
res = getattr(a, "eat") # # <bound method A.eat of <__main__.A object at 0x000>>
res() # bruce is eating
# getattr(a, "nname") # 报错
print(getattr(a, "nname", "找不到")) # 找不到
setattr
setattr(object, str)
设置对象的属性或者方法
第一个参数是对象,第二个参数是属性的字符串或者方法地址
已有就修改,没有就添加
注意:给实例添加的方法是属性
class A:
name = "bruce"
def __init__(self):
self.age = 18
def eat(self):
print(f"{self.name} is eating")
a = A()
setattr(a, "name", "lily")
print(getattr(a, "name")) # lily
setattr(a, "age", 20)
print(getattr(a, "age")) # 20
def func(self):
print("类外的函数1")
# 给实例添加的一个属性,他是方法
setattr(a, "func", func)
print(a.__dict__) # {'age': 20, 'name': 'lily', 'func': <function func at 0x000>}
a.func(a) # 类外的函数1
def func(self):
print("类外的函数2")
# 给类添加了一个方法
setattr(A, "func", func)
A.func(a) # 类外的函数2
a.func(a) # 类外的函数1
delattr
delattr(object, str)
删除对象的属性或者方法
第一个参数是对象,第二个参数是属性或者方法的字符串
没有返回值,删除没有的会报错
注意:通过实例无法删除类属性或者方法
class A:
name = "bruce"
def __init__(self):
self.age = 18
def eat(self):
print(f"{self.name} is eating")
# 对属性操作
a = A()
# delattr(a, "name") # 无法删除
delattr(a, "age")
print(getattr(a, "age", "找不到")) # 找不到
delattr(A, "name")
print(getattr(A, "name", "找不到")) # 找不到
# 对方法操作
a = A()
# delattr(a, "eat") # 无法删除
print(getattr(A, "eat", "找不到")) # 找不到
import sys
class A:
pass
class B(A):
pass
def func():
pass
module_member = sys.modules[__name__]
print(module_member)
# <module '__main__' from 'D:\\Python\\PythonProjects\\My_projects\\tets_tempory\\main.py'>
print(hasattr(module_member, "B")) # True
print(hasattr(module_member, "func")) # True
importlib
模块导入所需要的模块,通过ImportError
异常判断模块是否能导入getattr
反射获取模块的方法,通过AttributeError
异常判断该模块是否具有这个方法import importlib
module_name = input("module name:>>>")
method_name = input("method name:>>>")
try:
module = importlib.import_module(module_name)
method = getattr(module, method_name)
method()
except ImportError:
print("module not found")
except AttributeError:
print("method not found")
class FirePeaShooter:
def introduce(self):
print("I`m FirePeaShooter")
class IcePeaShooter:
def introduce(self):
print("T`m IcePeaShooter")
type = input("input type (fire or ice):>>>")
global_class = globals()
if "fire" in type:
class_type = "FirePeaShooter"
obj = global_class[class_type]()
obj.introduce()
elif "ice" in type:
class_type = "IcePeaShooter"
obj = global_class[class_type]()
obj.introduce()
else:
print("wrong")