今天发现了一个在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类的方式。