今天发现了一个在python中用来使变量转变为常量的装饰器,下面我展示下实现这个功能代码。
class MyMath(object): def __init__(self): self.__PI = "3.1415926" @property def PI(self): return self.__PI math = MyMath() print(math.PI) # 常量这个不能让别人修改的值
一般我们要想外部不能访问,都会给属性加上私有属性,只能够访问到,但不能被修改,这就是常量。现在我们在方法上面添加了一个装饰器@property,再把math.PI()的括号去掉,就变成了一种特殊的调用手段,只要用了这个调用手段,用了函数就不需要写括号了。这个也就是常量了。
class MyMath(object): def __init__(self): self.__PI = 3.1415926 @property def PI(self): return self.__PI @PI.setter def set_pi(self, new_pi): self.__PI = new_pi @PI.deleter def del_pi(self): print("del") del self.__PI math = MyMath() print(math.PI) # 常量这个不能让别人修改的值 # math.set_pi(3.1415926535) math.set_pi = 3.141592653523 del math.del_pi print(math.PI)下面在让我们来看看这段代码中改PI函数的属性,这里用到的是在方法上加一个属性@PI.setter,之后调用函数就可以直接赋值,而不用加括号了。但是要具体的改函数的值还要靠self.__PI = new_pi 这句代码去修改。以此类推,@PI.deleter就是删除
属性了。
再让我们来看看@property的另一种实现方式:
class MyMath(object): def __init__(self): self.__PI = 3.1415926 self.name = "oldyang" def get_PI(self): return self.__PI def set_PI(self, new_pi): self.__PI = new_pi def del_PI(self): print("del") del self.__PI PI = property(get_PI, set_PI, del_PI) # 这个就是使用Property类去替换我们的@property math = MyMath() print(math.PI) # 常量这个不能让别人修改的值 # math.set_pi(3.1415926535) math.PI = 3.141592653523 del math.PI print(math.PI)这就是将上面的装饰器替换成property类的方式。