内置的装饰器
property
先看一个例子:
class Student():
def __init__(self, age):
self.age = age
a = Student(18)
a.age = 20
这里age属性可以被直接更改,如果我们需要实现age私有化,可以使用如下:
class Student():
def __init__(self, age):
self.__age = age
def getage(self):
print(self.__age)
def setage(self, age):
self.__age = age
a = Student(18)
a.__age = 20
print(a.__age) #20
#表面上看,上面代码“成功”地设置了__age变量 20,但实际上这个__age变量和class内部的__age变量不是一个变量!
# 内部的__age变量已经被Python解释器自动改成了_Student_age,而外部代码给p新增了一个__age变量。 所以调用 getage输出的是初始值
a.getage() #18
但是,上面的调用方法是不是略显复杂,没有直接用属性这么直接简单。这时候就是property内置装饰器出场了。
#coding=utf-8
class Student():
def __init__(self, age):
self.__age = age
@property
def selfage(self):
"""I'm the 'age' property."""
return self.__age
@selfage.getter
def getage(self):
return self.__age
@selfage.setter
def setage(self, age):
self.__age = age
@selfage.deleter
def delage(self):
del self.__age
a = Student(18)
a.setage = 20
#a.setage(20) 不可用
print(a.getage)
print(Student.selfage.__doc__)
也可以这样写:
#coding=utf-8
class Student():
def __init__(self, age):
self.__age = age
def getage(self):
return self.__age
def setage(self, age):
self.__age = age
def delage(self):
del self.__age
selfage = property(getage, setage, delage, "I'm the 'age' property.")
a = Student(18)
a.selfage = 20
#a.setage(20) 不可用
print(a.selfage)
print(Student.selfage.__doc__)