python中的反射: hasattr、getattr、setattr 和 delattr*
程序员文章站
2022-07-15 16:49:50
...
1. hasattr
hasattr判断对象是否有某方法,返回True或False
class Dog(object):
def eat(self,food):
print("eat method!!!")
d = Dog()
#hasattr判断对象d是否有eat方法,有返回True,没有返回False
print(hasattr(d,'eat')) #True
print(hasattr(d,'cat')) #False
2. getattr
getattr获取属性的值
class A(object):
bar = 1
a = A()
print(getattr(a, 'bar')) # 获取属性 bar 值
print(getattr(a, 'bar2')) # 属性 bar2 不存在,触发异常
"""
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'bar2'
"""
print(getattr(a, 'bar2', 3)) # 属性 bar2 不存在,但设置了默认值
getattr获取对象方法内存地址
class Dog(object):
def eat(self):
print("eat method!!!")
d = Dog()
if hasattr(d,'eat'): # hasattr判断实例是否有eat方法
func = getattr(d, 'eat') # getattr获取实例d的eat方法内存地址
func() # 执行实例d的eat方法
#运行结果: eat method!!!
3. setattr
setattr() 函数的使用方法:
class A(object):
bar = 1
a = A()
print(getattr(a,'bar')) # 获取属性 bar 值
setattr(a, 'bar', 5) # 设置属性 bar 值
print(a.bar)
使用stattr给类实例对象动态添加一个新的方法
class Dog(object):
def eat(self,food):
print("eat method!!!")
d = Dog()
def bulk(self): #给Dog类添加一个方法必须先写这个方法
print('bulk method add to Dog obj')
d = Dog()
setattr(d,"bulk",bulk) #将bulk方法添加到实例d中,命名为talk方法
d.bulk(d) #实例d调用刚刚添加的talk方法时必须将实例d自身当变量传入,因为他不会自己传入self
#1. 注:setattr(x,’y’,z)用法: x就是实例对象 y就是在实例中调用时用的名字,z就是改变属性的值/或则要添加的函数的名字(正真的函数)
#2. setattr( 具体实例名称 , ’在类中调用时使用的名称’ , 要添加的真实函数的名称)
#3. 作用: setattr(d,"bulk",bulk) 将bulk方法添加到实例d中并且在实例中以bulk名称调用
使用stattr给类实例对象动态添加一个新的属性
class Dog(object):
def eat(self,food):
print("eat method!!!")
d = Dog()
#1 实例d中没有sex这个属性,就会动态添加一个属性 sex = Male
setattr(d,"sex",'Male') #给实例d添加一个属性:sex=Male
print("将实例d添加一个新属性sex=Male:", d.sex)
#2 如果实例d中本身存在这个属性那么 新的值就会覆盖这个属性
setattr(d,'name','name change to jack')
print("原本名字是Fly改变后的名字是:", d.name)
# 运行结果:
# 将实例d添加一个新属性sex=Male: Male
# 原本名字是Fly改变后的名字是: name change to jack
4. delattr删除实例属性
以下实例展示了 delattr 的使用方法:
class Coordinate(object):
x = 10
y = -5
z = 0
point1 = Coordinate()
print('x = ', point1.x)
print('y = ', point1.y)
print('z = ', point1.z)
delattr(Coordinate, 'z')
print('--删除 z 属性后--')
print('x = ', point1.x)
print('y = ', point1.y)
# 触发错误
# print('z = ', point1.z)
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s is eating....."%self.name)
d = Dog("NiuHanYang")
choice = input(">>:").strip()
if hasattr(d,choice):
delattr(d,choice) #使用delattr(d,choice)删除实例的属性那么所以下面打印就会报错
print(d.name)
# 运行结果:
# >>:name #输入的值是name
# 下面是报错信息
# Traceback (most recent call last):
# File "C:/Users/admin/PycharmProjects/s14/Day7/test1.py", line 10, in <module>
上一篇: CAT集成阿里RocketMQ产品
下一篇: js 电话验证
推荐阅读
-
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
-
python中的__dict__,__getattr__,__setattr__
-
python中hasattr()、getattr()、setattr()函数的使用
-
python hasattr,getattr,setattr,delattr
-
python3中的setattr(),getattr(),hasattr(),delattr()
-
反射 | hasattr() | getattr() | setattr() | delattr() 的使用方法
-
#python中的反射方法,getattr,setattr,hasattr,delattr
-
python 的getattr()函数、setattr()函数、hasattr()函数、delattr()函数
-
Python类的BIF(issubclass, isinstance, hasattr ,getattr, setattr, delattr)
-
python中的getattr hasattr setattr delattr