欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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>
相关标签: python基础