9.21 避免重复的属性方法

问题

你在类中需要重复的定义一些执行相同逻辑的属性方法,比如进行类型检查,怎样去简化这些重复代码呢?

解决方案

考虑下一个简单的类,它的属性由属性方法包装:

class Person:
    def __init__(self, name ,age):
        self.name = name
        self.age = age

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        if not isinstance(value, str):
            raise TypeError('name must be a string')
        self._name = value

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        if not isinstance(value, int):
            raise TypeError('age must be an int')
        self._age = value

一个可行的方法是创建一个函数用来定义属性并返回它。例如:

讨论

函数 typed_property() 看上去有点难理解,其实它所做的仅仅就是为你生成属性并返回这个属性对象。 因此,当在一个类中使用它的时候,效果跟将它里面的代码放到类定义中去是一样的。 尽管属性的 gettersetter 方法访问了本地变量如 name , expected_type 以及 storate_name ,这个很正常,这些变量的值会保存在闭包当中。

我们还可以使用 functools.partial() 来稍稍改变下这个例子:

Last updated

Was this helpful?