我们在Python中定义class的时候有几个很有意思的魔法方法, 这些方法可以让你创建的类富有其他builtin类型的class的特性(比如dict字典, list等)。
案例一: 模拟python中的字典类
class MyDict:
def __init__(self,key,value):
self.my_dict = {
}
self.my_dict[key] = value
def __getitem__(self,key):
return self.my_dict[key]
def __setitem__(self,key,value): #当你给这个类的实例传入key, value参数时会直接给实例的my_dict字典变量赋值
self.my_dict[key] = value
def __delitem__(self, key):
del self.my_dict[key]
myDictInstance = MyDict('name','Tyler')
print(myDictInstance['name']) #Tyler
myDictInstance['Age'] = '32'
print(myDictInstance['Age']) #32
上面这个例子看起来没什么实际意义, 那么下面举一个api自动化测试的实际工作案例:在自动化测试一个软件的API时往往需要设置api请求的request header,request payload等。 如果我们实际使用中发现一个api class的实例的request header频繁改变,但是request payload等却基本不变。 那我们就可以给这个api class设置魔法方法使得外界默认传递参数只修改header字段。
案例二: 只修改API class中的header变量,其他变量不变
class API():
def __init__(self, url=None, user=None, password=None, scope="system"):
self.url = url
self.user = user
self.password = password
self.scope = scope
self.headers = self._headers()
def _headers(self):
headers = {
"Content-Type": "application/json",
"Accept": "application/json"
}
return headers
def __setitem__(self, key, value):
self.headers[key] = value
return self.headers
def __getitem__(self, key):
return self.headers[key]
apiInstance = API(url, user, pwd)
apiInstance['key1'] = 'value1'
apiInstance['key2'] = 'value2'
print(apiInstance.headers)
'''
{
"Content-Type": "application/json",
"Accept": "application/json",
"key1": "value1",
"key2": "value2"
}
'''
Java中没有找到类似的魔法方法, 如果有知道的大牛也欢迎留言分享~