引子:
在Java中,我们将对象字段定义为private字段,这样在调用过程中不能直接调用对象字段,需要通过setter/getter进行读取/赋值,保障了数据的安全性。
在Python中,通过property,使得不再需要setter/getter进行private对象字段的包装。Python约定成俗的规定是在private字段前添加“_”/“__”。
private字段变为只读字段:
class TestClass:
def __init__(self, x):
self._x = x
这里定义了一个TestClass类,它有一个实例字段_x,定了用户传来的x值,_x是private字段,通过object._x访问private字段不符合语言规范,进而我们要将_x变为property(特性),通过object.x来访问。
class TestClass(object):
def __init__(self, x):
self._x = x
@property
def x(self):
return self._x
my = TestClass(20)
# 运行ok
print(my.x)
结果:
20
这里能看到,对_x字段进行了 property特性设置,进行只读操作,如果要对_x字段进行赋值该如何操作呢?
class TestClass(object):
def __init__(self, x):
self._x = x
@property
def x(self):
return self._x
# 赋值操作
@x.setter
def x(self, value):
self._x = value
my = TestClass(20)
# 运行ok
print(my.x)
my.x = 30
print(my.x)
结果:
20
30
我们通常使用内置的@property装饰器。但其实property是一个类,python中类和函数的调用方式都差不多,他们都是可调用对象
property的构造方法如下:
class property(object):
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
""""""
它最大接受4个参数,都可以为空。
第一个为getter,第二个为setter,第三个为delete函数,第四个为文档。
上述代码另一种写法
class TestClass:
def __init__(self, x):
self._x = x
def get_x(self):
return self._x
def set_x(self, value):
self._x = value
x = property(get_x, set_x)
>>> obj = TestClass(10)
>>> obj.x
10