Python可调用对象和不可变对象

一、可调用对象

在类中定义__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'

你可能感兴趣的:(Python可调用对象和不可变对象)