Pyhton-反射

获取对象信息——反射(hasattr()、getattr()、setattr()、delattr())

所谓反射,指的是以字符串的形式来操作(增删改查)对象的属性或方法。
只有在不知道对象信息的情况下,才回去获取对象信息,因此若果可以直接写object.name,就不要写为getattr(object, ‘name’)

用于反射的内置函数有以下四个(参数name都是一个字符串):

1、hasattr(object, ‘name’)

用于判断指定的对象object是否有参数name指定的属性或方法。返回值为布尔值

#!/usr/bin/python3

class MyClass(object):
    ca = 'ca'
    def __init__(self):
        self.x = 1

    def im(self):
        print('im被调用了')

    @classmethod
    def cm(cls):
        print('cm被调用了')

    @staticmethod
    def sm():
        print('sm被调用了')

print('# 类对象包含的属性和方法')
print(dir(MyClass))
print('')
print(hasattr(MyClass, 'ca'))           # 类对象可以访问类属性,返回True
print(hasattr(MyClass, 'x'))            # 类对象不能访问实例属性,返回False
print(hasattr(MyClass, '__init__'))     # 类对象可以访问实例方法,返回True
print(hasattr(MyClass, 'im'))           # 类对象可以访问实例方法,返回True
print(hasattr(MyClass, 'cm'))           # 类对象可以访问类方法,返回True
print(hasattr(MyClass, 'sm'))           # 类对象可以访问静态方法,返回True

print('')

print('# 实例对象包含的属性和方法')
print(dir(MyClass()))
print('')
print(hasattr(MyClass(), 'ca'))         #实例对象可以访问类属性,返回True
print(hasattr(MyClass(), 'x'))          #实例对象可以访问实例属性,返回True
print(hasattr(MyClass(), '__init__'))   #实例对象可以访问实例方法,返回True
print(hasattr(MyClass(), 'im'))         #实例对象可以访问实例方法,返回True
print(hasattr(MyClass(), 'cm'))         #实例对象可以访问类方法,返回True
print(hasattr(MyClass(), 'sm'))         #实例对象可以访问静态方法,返回True
[root@lyucan ~]# ./hasattr.py
# 类对象包含的属性和方法
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'im', 'sm']

True
False
True
True
True
True

# 实例对象包含的属性和方法
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'im', 'sm', 'x']

True
True
True
True
True
True

2、getattr(object, ‘name’[, default])

用于获取指定的对象object中名为name的属性或方法。返回的是对象,可以将其赋值给一个变量,使用变量直接引用。
如果不指定参数default,那么当object中不存在名为name的属性或方法时,抛出AttributeError。
如果制定了参数default,那么当object中不存在名为name的属性或方法时,就会返回default。
getattr(object, name)等价于:object.name。

#!/usr/bin/python3

class MyClass(object):
    ca = 'ca'
    def __init__(self):
        self.x = 1

    def im(self):
        print('im被调用了')

    @classmethod
    def cm(cls):
        print('cm被调用了')

    @staticmethod
    def sm():
        print('sm被调用了')

print('# 类对象包含的属性和方法')
print(dir(MyClass))
print('')
print(getattr(MyClass, 'ca'))
#print(getattr(MyClass, 'x'))
print(getattr(MyClass, '__init__'))
print(getattr(MyClass, 'im'))
print(getattr(MyClass, 'cm'))
print(getattr(MyClass, 'sm'))

print('')

print('# 实例对象包含的属性和方法')
print(dir(MyClass()))
print('')
print(getattr(MyClass(), 'ca'))
print(getattr(MyClass(), 'x'))
print(getattr(MyClass(), '__init__'))
print(getattr(MyClass(), 'im'))
print(getattr(MyClass(), 'cm'))
print(getattr(MyClass(), 'sm'))
[root@lyucan ~]# ./getattr.py
# 类对象包含的属性和方法
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'im', 'sm']

ca
<function MyClass.__init__ at 0x7f69bd143bf8>
<function MyClass.im at 0x7f69bd143c80>
<bound method MyClass.cm of <class '__main__.MyClass'>>
<function MyClass.sm at 0x7f69bd143d90>

# 实例对象包含的属性和方法
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'im', 'sm', 'x']

ca
1
<bound method MyClass.__init__ of <__main__.MyClass object at 0x7f69bd1dc828>>
<bound method MyClass.im of <__main__.MyClass object at 0x7f69bd1dc828>>
<bound method MyClass.cm of <class '__main__.MyClass'>>
<function MyClass.sm at 0x7f69bd143d90>

3、setattr(object, ‘name’, value)

用于在指定的对象object中添加或修改名为name的属性或方法,添加或修改后的值为value。
setattr(object, name, value)等价于:object.name = value。

#!/usr/bin/python3

class MyClass(object):
    ca = 'ca'
    def __init__(self):
        self.x = 1

    def im(self):
        print('im被调用了')

    @classmethod
    def cm(cls):
        print('cm被调用了')

    @staticmethod
    def sm():
        print('sm被调用了')

mc = MyClass()

setattr(mc, 'new', 11)

print(getattr(mc, 'new'))
[root@lyucan ~]# ./setattr.py
11

4、delattr(object, ‘name’)

用于删除指定的对象object中名为参数name的属性或方法。
delattr(object, ‘name’)等价于:del object.name

#!/usr/bin/python3

class MyClass(object):
    ca = 'ca'
    def __init__(self):
        self.x = 1

    def im(self):
        print('im被调用了')

    @classmethod
    def cm(cls):
        print('cm被调用了')

    @staticmethod
    def sm():
        print('sm被调用了')

mc = MyClass()

setattr(mc, 'new', 11)

print(getattr(mc, 'new'))

delattr(mc, 'new')             # 删除了mc实例对象的new属性

print(getattr(mc, 'new', 'mc实例对象没有new属性'))
[root@lyucan ~]# ./delattr.py
11
mc实例对象没有new属性            # 没有属性才会打印这行信息

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com