@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