getattr()、setattr()和__getattribute__()
当读取对象的某个属性时,python会自动调用__getattr__()方法。例如fruit.color将转换为fruit.getattr(color)
实例:
class Fruit(object):
def __init__(self,color="red",price=0):
self.__color=color
self.__price=price
def __getattribute__(self, name):
return object.__getattribute__(self,name)
def __setattr__(self, name, value):
self.__dict__[name] = value
if __name__=="__main__":
fruit = Fruit("blue",10)
print fruit.__dict__.get("_Fruit__color")
fruit.__dict__["_Fruit__price"]=5
print fruit.__dict__.get("_Fruit__price")
结果为:blue
5
getitem()
如果类中把某个属性定义为序列,可以使用__getitem__()输出序列属性中的各个元素
class FruitShop:
def __getitem__(self, i):
return self.fruits[i]
if __name__=="__main__":
shop = FruitShop()
shop.fruits=["apple","banana"]
print shop[1]
for item in shop:
print item
结果为:banana
apple
banana
__str__()
用于表示对象代表的含义,返回一个字符串,实现了__str__()方法后,可以直接使用print语句输出对象,也可以通过函数str()触发__str__()执行
class Fruit:
"""Fruit类""" #Fruit类的文档字符串
def __str__(self): #返回Fruit类的文档字符串
return self.__doc__
if __name__=="__main__":
fruit = Fruit()
print str(fruit) #调用内置函数str()可以触发__str__()方法。输出结果:Fruit类
print fruit #直接输出对象fruit,返回__str__()方法的值,输出结果是:Fruit类
__call__()
在类中实现__call__()方法,可以在对象创建时直接返回__call__()的内容,使用该方法可以模拟静态方法
class Fruit:
class Growth:
def __call__(self):
print "grow..."
grow = Growth() #调用Growth内部类,将类Growth作为函数返回,即为外部类Fruit定义方法grow(),grow()将执行__call__()内的代码
if __name__=='__main__':
fruit = Fruit()
fruit.grow()
Fruit.grow()