一、可调用对象
在类中定义__call__魔术方法,由此创建的对象就可以像函数那样进行调用了
class People:
def __call__(self, food):
print("他在吃{0}".format(food))
man = People()
man("苹果")
他在吃苹果
一般情况下,调用一次函数后便会被销毁,并不会记录上一次调用的结果,这是无状态的。可以给调用对象增加记忆功能,使其成为有状态的函数,修改People类。
class People:
def __init__(self):
self.food = []
def __call__(self, food):
self.food.append(food)
print("他在吃{0}".format(food))
def __str__(self):
return str.join("-->",self.food)
man = People()
man("苹果")
man("饼干")
man("牛奶")
man("鸡蛋")
print("他吃东西的顺序是:",str(man))
他在吃苹果
他在吃饼干
他在吃牛奶
他在吃鸡蛋
他吃东西的顺序是: 苹果-->饼干-->牛奶-->鸡蛋
二、不可变对象
我们知道元组是不可变对象,不可变对象常用于线程同步,使用__slots__魔术方法可以创建不可变对象。
可变对象:使用__dict__属性查看当前实例的属性和属性值
class People:
def __init__(self):
self.food = []
self.hobby = "篮球"
self.age = "22岁"
def __call__(self, food):
self.food.append(food)
print("他在吃{0}".format(food))
def __str__(self):
return str.join("-->",self.food)
man = People()
man.name = "小王"
print("man对象的属性是:",man.__dict__)
del man.name
print("man对象的属性是:",man.__dict__)
man对象的属性是: {'food': [], 'hobby': '篮球', 'age': '22岁', 'name': '小王'}
man对象的属性是: {'food': [], 'hobby': '篮球', 'age': '22岁'}
在类中定义__slots__对象,该对象会自动替换__dict__对象,转变为不可变对象。在__slots__中设置属性名后,就只能使用__slots__中包含的属性名,否则就会触发异常。
class People:
__slots__ = ["food","hobby","age"]
def __init__(self):
self.food = []
self.hobby = "篮球"
self.age = "22岁"
def __call__(self, food):
self.food.append(food)
print("他在吃{0}".format(food))
def __str__(self):
return str.join("-->",self.food)
man = People()
print("man对象的属性是:",man.__slots__)
man.name = "小王"
man对象的属性是: ['food', 'hobby', 'age']
AttributeError: 'People' object has no attribute 'name'