@property@staticmethod @classmethod

Posted Mitsuis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@property@staticmethod @classmethod相关的知识,希望对你有一定的参考价值。

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

 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的主要内容,如果未能解决你的问题,请参考以下文章

@property@staticmethod@classmethod装饰器

@property@staticmethod @classmethod

python三个自带装饰器的功能与使用(@property@staticmethod@classmethod)

SQL CTE性能是否取决于声明顺序?

C/C++ ceil 函数

C/C++ floor 函数