初识property
python中的property
类可以让我们以处理变量的方式来调用函数
我们先感性地认识一下它。若有代码:
class Student:
def __init__(self):
self.__age = 19
Bob = Student()
print(Bob.__age)
结果为:
AttributeError: 'Student' object has no attribute '__age'
可以发现,我们从外部不能访问私有变量。关于变量的命名,可以参考https://blog.csdn.net/qq_45812220/article/details/137295390
而若我们把代码改为:
class Student:
def __init__(self):
self.__age = 19
def age(self):
return self.__age
Bob = Student()
print(Bob.age)
结果为
19
这里用到了装饰器,关于装饰器,可以参考https://blog.csdn.net/qq_45812220/article/details/137809943
可以发现,age()
虽然是一个方法,但我们却通过类似变量的方式对它进行了访问,得到了它的返回值。这就是property
最基本的使用
property进阶
在pycharm中输入property,ctrl+左键可查看property的官方说明文档。
"""
Property attribute.
fget
function to be used for getting an attribute value
fset
function to be used for setting an attribute value
fdel
function to be used for del'ing an attribute
doc
docstring
Typical use is to define a managed attribute x:
class C(object):
def getx(self): return self._x
def setx(self, value): self._x = value
def delx(self): del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
Decorators make defining new properties or modifying existing ones easy:
class C(object):
@property
def x(self):
"I am the 'x' property."
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
# (copied from class doc)
"""
我们直接以它的typical use
说法进行举例
class Student:
def __init__(self):
self.__age = 19
def fget(self):
return self.__age
def fset(self,value):
self.__age = value
def fdel(self):
del self.__age
age = property(fget,fset,fdel)
Bob = Student()
print(Bob.age)
Bob.age = 24
print(Bob.age)
执行结果为:
19
24
我们通过往property中填入查询、修改和删除三个函数名,来得到了一个可操作的age
对象,从而可以直接通过修改age
来间接修改私有变量__age
。
我们刚才展示了查询和修改,现在我们展示删除
class Student:
def __init__(self):
self.__age = 19
def fget(self):
return self.__age
def fset(self,value):
self.__age = value
def fdel(self):
del self.__age
age = property(fget,fset,fdel)
Bob = Student()
del Bob.age
print(Bob.age)
得到报错
AttributeError: 'Student' object has no attribute '_Student__age'
私有变量在外部甚至是不能查询的,而我们这里成功将它删除了,说明我们的删除操作成功了
property
的讲解到此基本结束,下面是额外的使用技巧
如果读者只想要查询,而不需要其他操作,可以直接使用我们一开始的用法:
class Student:
def __init__(self):
self.__age = 19
def age(self):
return self.__age
Bob = Student()
print(Bob.age)
而如果只想要修改,可以使用setter
,如下面代码所示:
class Student:
def __init__(self):
self.__age = 19
def age(self):
return self.__age
.setter
def age(self,value):
self.__age = value
Bob = Student()
Bob.age = 44
print(Bob.age)
结果为
44
这里我们为了查询结果,,依然使用了@property
。但这并不是必须的。
我们也可以单独使用删除操作,只需加上这一段代码即可,与之前完全一样。
.deleter
def age(self):
del self.__age
关于property的讲解到此结束,如有错误,欢迎指出