Python 單雙下劃線方法在接口自動化中的高級用法(_、__)
使用單下劃線 _ 來封裝內部方法
使用場景:
在一個 HTTP 請求客戶端類中封裝一個內部方法,該方法用于處理請求的響應。
這個方法只應該在類的內部使用,不應該被外部直接調用。
import requests
class HttpClient:
def __init__(self, base_url):
self.base_url = base_url
def _handle_response(self, response):
if response.status_code != 200:
raise Exception(f"Request failed with status {response.status_code}")
return response.json()
def get(self, endpoint):
url = f"{self.base_url}/{endpoint}"
response = requests.get(url)
return self._handle_response(response)
client = HttpClient("https://api.example.com")
data = client.get("/resources")
print(data)
注意事項:
_handle_response 方法是內部使用的,不應從類外部直接調用。
確保處理所有可能的異常情況。
使用雙下劃線 __ 來實現初始化邏輯
使用場景:
在接口測試類中,使用 __init__ 方法來設置基本的測試配置,比如 URL、認證信息等。
import requests
class TestAPI:
def __init__(self, base_url, auth_token):
self.base_url = base_url
self.auth_token = auth_token
def test_get_resources(self):
headers = {'Authorization': f'Bearer {self.auth_token}'}
response = requests.get(f"{self.base_url}/resources", headers=headers)
assert response.status_code == 200
test_api = TestAPI("https://api.example.com", "my-token")
test_api.test_get_resources()
注意事項:
確保 __init__ 方法設置了必要的初始化參數。
注意處理可能的認證失敗情況。
使用雙下劃線 __ 來實現字符串表示
使用場景:
在接口測試結果類中,使用 __str__ 方法來自定義輸出格式,便于查看測試結果。
class TestResult:
def __init__(self, passed, message):
self.passed = passed
self.message = message
def __str__(self):
status = "Passed" if self.passed else "Failed"
return f"{status}: {self.message}"
result = TestResult(True, "All tests passed")
print(result)
注意事項:
__str__ 方法應返回易于理解的字符串。
確保測試結果的格式清晰明了。
使用雙下劃線 __ 來實現布爾值轉換
使用場景:
在測試結果類中,使用 __bool__ 方法來判斷測試是否通過。
class TestResult:
def __init__(self, passed, message):
self.passed = passed
self.message = message
def __bool__(self):
return self.passed
result = TestResult(True, "All tests passed")
assert bool(result), "Test should pass."
注意事項:
__bool__ 方法應返回布爾值。
注意處理邊緣情況,如未完成的測試等。
使用單下劃線 _ 來封裝內部屬性
使用場景:
在接口測試類中,使用單下劃線 _ 來標記內部使用的屬性,如認證信息。
class TestAPI:
def __init__(self, base_url, auth_token):
self.base_url = base_url
self._auth_token = auth_token
def test_get_resources(self):
headers = {'Authorization': f'Bearer {self._auth_token}'}
response = requests.get(f"{self.base_url}/resources", headers=headers)
assert response.status_code == 200
test_api = TestAPI("https://api.example.com", "my-token")
test_api.test_get_resources()
注意事項:
單下劃線 _ 標記的屬性不建議從類外部直接訪問。
確保在類內部正確使用這些屬性。
使用雙下劃線 __ 來實現類的實例化
使用場景:
在測試框架中,使用 __new__ 方法來控制類的實例化過程,例如,只允許創建一個實例。
class SingletonTestFramework:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(SingletonTestFramework, cls).__new__(cls)
return cls._instance
framework = SingletonTestFramework()
another_framework = SingletonTestFramework()
assert framework is another_framework
注意事項:
__new__ 方法用于控制實例的創建過程。
注意單例模式的實現細節。
使用雙下劃線 __ 來實現格式化輸出
使用場景:
在測試報告類中,使用 __format__ 方法來自定義輸出格式。
class TestReport:
def __init__(self, name, result):
self.name = name
self.result = result
def __format__(self, format_spec):
if format_spec == "short":
return f"{self.name}: {self.result}"
return f"{self.name}: {self.result} (full report)"
report = TestReport("Test Name", "Passed")
print(f"{report:short}")
注意事項:
__format__ 方法應支持不同的格式化選項。
注意處理格式化字符串的解析。
使用雙下劃線 __ 來實現比較操作
使用場景:
在測試結果類中,使用 __eq__ 方法來自定義相等性比較。
class TestResult:
def __init__(self, passed, message):
self.passed = passed
self.message = message
def __eq__(self, other):
if isinstance(other, TestResult):
return self.passed == other.passed and self.message == other.message
return False
result1 = TestResult(True, "All tests passed")
result2 = TestResult(True, "All tests passed")
assert result1 == result2
注意事項:
__eq__ 方法應正確比較對象的內容。
注意處理不同類型的對象之間的比較。
使用雙下劃線 __ 來實現對象的刪除
使用場景:
在測試框架中,使用 __del__ 方法來清理資源,如關閉連接。
import requests
class TestFramework:
def __init__(self, session):
self.session = session
def __del__(self):
self.session.close()
session = requests.Session()
framework = TestFramework(session)
del framework
注意事項:
__del__ 方法用于對象銷毀時的資源清理。
注意處理異常情況下的資源釋放。
使用雙下劃線 __ 來實現對象的復制
使用場景:
在測試配置類中,使用 __copy__ 和 __deepcopy__ 方法來自定義淺拷貝和深拷貝行為。
import copy
class TestConfig:
def __init__(self, name, settings):
self.name = name
self.settings = settings
def __copy__(self):
return TestConfig(self.name, self.settings.copy())
def __deepcopy__(self, memo):
return TestConfig(self.name, copy.deepcopy(self.settings, memo))
config = TestConfig("Test Config", {"key": "value"})
shallow_copy = copy.copy(config)
deep_copy = copy.deepcopy(config)
config.settings["key"] = "changed"
assert config.settings["key"] == "changed"
assert shallow_copy.settings["key"] == "changed"
assert deep_copy.settings["key"] == "value"
注意事項:
__copy__ 和 __deepcopy__ 方法用于自定義復制行為。
注意處理復雜數據結構的復制。