抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

property的作用

众所周知property是一个装饰器,这里不讲装饰器的概念,说一下property的特点:

  • 可以将类方法转换为只读属性
  • 可以重新实现一个属性的setter和getter方法

property的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# coding: utf8
"""
class中setter用法
"""
class StudentInfo:
def init(self, sex=None, age=None):
self._sex = sex
self._age = age

@property
def sex(self):
return self._sex

@property
def age(self):
return self._age

S = StudentInfo()
print(S.age)
print(S.sex)

运行一下,结果

image.png

如上代码,定义一个学生类,包含了sex和age方法,正常来说实例化之后需要 S.sex(), S.age()来引用,而这边因为加上了装饰器property,使得这边可以像Java中一样,直接S.age, S.sex来使用。当然,因为没赋值,打印出来都是None。

getter和setter

上面的代码,某种意义上来说,如此调用,可以看做是python中的”getter”了。

尝试一下,紧接上面代码,将age赋值为11。

1
S.age = 11

结果

image.png

报错了,AttributeError: can’t set attribute,说明还不具备set属性。那么参考Java,有没有办法直接赋值呢?

有的,那就是setter装饰符号。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# coding: utf8
"""
class中setter用法
"""
class StudentInfo:
def __init__(self, sex=None, age=None):
self._sex = sex
self._age = age

@property
def sex(self):
return self._sex

@sex.setter
def sex(self, value):
self._sex = value

@property
def age(self):
return self._age

@age.setter
def age(self, value):
self._age = value

S = StudentInfo()
S.sex = '男'
S.age = 18
print(S.age)
print(S.sex)

运行一下,结果:

image.png

如代码所示,定义了age方法,使用property进行了装饰,那么就可以使用age.setter装饰符,得到跟Java中setter一样的方法。修改后的代码,直接赋值并未报错,打印也显示了。

延伸

property和setter的作用大家已经看到了,那么在实际使用中有什么意义呢?

首先,使用装饰器的优点之一就是:不需要对原方法进行修改。

另外,就是我们可以使用这样的方式来定义集合。在uiautomation-f6项目中,已经体现了。

image.png

截取部分。在接口自动化里,每个workflow开头都会定义一个result,这个result可看做是一个属性集合,里面包含了用例执行结果,执行时间,执行消息等。

所以在我们实际写workflow的时候,就方便多了,首先定义一个result,然后人为去判断用例执行的结果,使用 result.success = True来往结果集里塞值,而在分析结果集的地方,只需要接收这个result, 然后使用诸如result.success的方式来获取想要的属性,后期添加属性也省事。

回列表

评论