码迷,mamicode.com
首页 > 其他好文 > 详细

@property、@staticmethod 、@classmethod、

时间:2017-04-21 22:28:05      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:调用   方便   name   blog   integer   异常   between   not   set   

在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以对属性随便修改,不能限制输入。

 1 class Student(object):
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 
 6 s = Student(Mitsui, 24)
 7 s.name = 123
 8 s.age = 青年
 9 print(s.name)
10 print(s.age)
11 >>>>
12 123
13 青年

这显然不合逻辑,也许名字可以叫123,但是年龄是青年就是有问题了。对于追求完美的Python程序员来说,这时候就需要引用一个装饰器 @property.

class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    @property      #引用装饰器property
    def age(self):
        return self.__age
    @age.setter    #函数修饰后可以作为装饰器使用调用后可以修改原始数据
    def age(self,value):
        if not isinstance(value, int):
            raise ValueError(score must be an integer!)  #非int类型抛异常
        if value < 0 or value > 100:
            raise ValueError(score must between 0 ~ 100!) #年龄基本都是0-100以内,限制输入
        self.__age = value

s = Student(Mitsui, 24) #当age参数传入24,age会去找被property修饰的age 实际上age = self.__age而非self.age
print(s.name,s.age)       #也就是age参数会传入age()方法中的value参数,开始执行age.setter,实现规范输入的目的,
s.age = 18                #同时在调用时,把 age()方法变成一个可以赋值的属性,让调用者更加方便的调用
s.name = BOBO
print(s.name)
print(s.age)            #没有赋值实际上执行了age方法下的 ‘return self.__age’

@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。

 

@property、@staticmethod 、@classmethod、

标签:调用   方便   name   blog   integer   异常   between   not   set   

原文地址:http://www.cnblogs.com/mitsui/p/6746322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!