python第七课 简析反射的使用

import sys
import inspect
class Dog(object): # 类,Cat指向这个类对象
    def __init__(self, name='tom'):
        self.name = name
    def sayHi(self): #  实例方法,sayHi指向这个方法对象,使用类或实例.sayHi访问
        print(self.name, 'says Hi!') # 访问名为name的字段,使用实例.name访问

dog = Dog()
print(dog.name)
print(Dog.sayHi) # 使用类名访问实例方法时,方法是未绑定的(unbound)
print(dog.sayHi) # 使用实例访问实例方法时,方法是绑定的(bound)
View Code

我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的某个字段赋值,而方法名或是字段名在编码代码时并不能确定,需要通过参数传递字符串的形式输入。

1.访问对象属性

dog = Dog('Merry')

print(dog.name) # 访问实例属性
dog.sayHi() # 调用实例方法

print(dir(dog)) # 获取实例的属性名,以列表形式返回
if hasattr(dog, 'name'): # 检查实例是否有这个属性
    setattr(dog, 'name', 'tiger') # same as: a.name = 'tiger'
print(getattr(dog, 'name')) # same as: print a.name

getattr(dog, 'sayHi')() # same as: tiger.sayHi()

执行结果如下:

dir([obj]): 调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内)。obj的默认值是当前的模块对象。

hasattr(obj, attr): 这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。

getattr(obj, attr): 调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为'bar',则返回obj.bar。

setattr(obj, attr, val):调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为'bar',则相当于obj.bar = val。

posted on 2016-03-10 16:32  学习永远在路上  阅读(148)  评论(0编辑  收藏  举报