python中的property

需求:一个People类,类中很简单就只年龄和名字的属性,在实例化的时候需要对年龄的数值进行判断,若在合理的范围之内则进行正常实例化,否则打印出提示信息。

先看如下的一个操作:

class People(object):    def __init__(self,name,age):
        self.name = name
        self.age = age    def get_info(self):        print("The %s is %d years old" % (self.name, self.age))

然后做如下操作:

a = People("job", 23)  #实例化
a.get_info()           #得到信息
a.name = "Swift"       #更改属性的值
a.age = 1000           #对age的更改显然不符合实际需求,因为人的年龄不可能达到1000岁的,
a.get_info()           #得到更改之后的信息

python中的propertypython中的property

The job is 23 years old          #更改之前的信息The Swift is 1000 years old   #更改之后的信息

上述操作的结果

改进:在实例化的时候,希望能够对age的范围进行判断,若范围合理则进行实例化操作,否则提示用户。

class People(object):    def __init__(self,name,age):
        self.name = name
        self.age = age    def set_age(self,age):             #对age的值进行判断
        if age > 0 and age < 100:
            self.age = age        else:            print("the age is invalid value, Please check it!")
            exit()    def get_info(self):        print("The %s is %d years old" % (self.name, self.age))

上述代码改进之后,做如下操作:

>>> a = People("job", 23)       #在实例化时传入的age数值仍然不会判断是否合理>>> a.get_info()
The job is 23 years old>>> a.set_age(124)               #修改数值时调用set_age方法则可以进行合理范围判断>>> a.get_info()
the age is invalid value, Please check it!

分析:在使用set_age修改age值时可以对age的值进行判断,但是这样调用总是没有直接使用a.age = value的形式方便。

为了解决这个问题,python引入了property语法糖。

class People(object):    def __init__(self,name,age):
        self.name = name
        self.__age = age

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

    @age.setter    def age(self,age):        if age > 0 and age < 100:
            self.__age = age        else:            print("the age is invalid value, Please check it!")
            exit()

注意: 第一个age(self)是get方法,用@property装饰,第二个age(self, score)是set方法,用@age.setter装饰,@age.setter是前一个@property装饰后的副产品。

执行结果如下:

>>> a = People("Job", 23)>>> print(a.age)23
>>> a.age = 123               #通过age赋值,检查数值的范围是否合理>>> print(a.age)
the age is invalid value, Please check it!

可以看到对age的调用其实在调用set方法。

在这里是把property作为语法糖使用,也可以作为property函数使用,作为函数使用的用法可以参考博文开始提高的第二篇博文中最后面的介绍!

上一篇:python之内置的@property装饰器


下一篇:Laravel 开发插件必备三件套