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