Python类内条件触发时同步修改类外全局变量解决方案
问题原因
Python类的方法内部如果直接对外部同名变量执行赋值、自增减操作,会默认将该变量判定为方法内的局部变量,不会关联全局作用域的ChakCak_After。直接运行原代码会抛出UnboundLocalError: local variable 'ChakCak_After' referenced before assignment错误,无法实现值的同步更新。此外原代码还存在逻辑缺失:判断逻辑写在类初始化方法中仅会执行1次,无法配合for循环实现多次遍历判断,还存在Chrome驱动误用Edge Service的兼容隐患。
实现方案
方案1:global关键字声明全局变量(实现最简单)
在类方法内操作全局变量前,用global关键字声明变量来自全局作用域,修改后的值会直接同步到类外部,同时补充for循环遍历逻辑、修正驱动导入问题、增加页面等待:
# -*- coding: utf-8 -*- from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service from selenium import webdriver import time Driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) ChakCak_After = 2 class In_Cookies: def check_url(self): # 声明当前操作的是全局作用域的ChakCak_After global ChakCak_After Driver.get("https://outlook.live.com/") # 等待3秒让页面完成跳转,避免URL获取不准确 time.sleep(3) ChakCak_URL = Driver.current_url ChakCak_URL_split = ChakCak_URL.strip().split("/")[3] Gam3 = "https://outlook.live.com/" + ChakCak_URL_split url_chask = "https://outlook.live.com/owa" if Gam3 == url_chask: ChakCak_After -= 1 print(f"Conditions are met, current ChakCak_After value: {ChakCak_After}") else: print("لم يتم استيفاء الشروط") if __name__ == "__main__": cookie_check = In_Cookies() # 按需求执行for循环遍历,此处示例遍历3次,可根据实际场景调整遍历范围 for i in range(3): cookie_check.check_url() # 验证类外部变量同步结果 print(f"Final ChakCak_After value outside class: {ChakCak_After}") Driver.quit()
方案2:类属性维护计数(代码更规范,推荐)
全局变量会提升代码耦合度,提升后续维护成本。更合理的写法是将计数值作为类的实例属性维护,需要使用时通过类方法获取最终值即可,不需要依赖global声明:
# -*- coding: utf-8 -*- from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service from selenium import webdriver import time class In_Cookies: def __init__(self, init_count): # 初始化时传入初始计数值,作为实例属性维护 self.ChakCak_After = init_count self.Driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) def check_url(self): self.Driver.get("https://outlook.live.com/") time.sleep(3) ChakCak_URL = self.Driver.current_url ChakCak_URL_split = ChakCak_URL.strip().split("/")[3] Gam3 = "https://outlook.live.com/" + ChakCak_URL_split url_chask = "https://outlook.live.com/owa" if Gam3 == url_chask: self.ChakCak_After -= 1 print(f"Conditions are met, current ChakCak_After value: {self.ChakCak_After}") else: print("لم يتم استيفاء الشروط") def get_count(self): # 提供方法获取当前计数值 return self.ChakCak_After def close_driver(self): self.Driver.quit() if __name__ == "__main__": # 实例化类时传入初始值2 cookie_check = In_Cookies(init_count=2) # for循环遍历执行判断 for i in range(3): cookie_check.check_url() # 将类内部计算的最终值同步到外部变量 ChakCak_After = cookie_check.get_count() print(f"Final ChakCak_After value outside class: {ChakCak_After}") cookie_check.close_driver()
关键注意点
- 不要将需要重复执行的判断逻辑写在
__init__初始化方法中,该方法仅在类实例化时执行1次,需要抽为独立方法在循环中调用 - 网页加载、跳转存在延迟,打开URL后需要增加适当等待,否则页面未跳转完成就获取URL会导致判断结果错误
- 不同浏览器的驱动Service不要混用,Chrome对应
selenium.webdriver.chrome.service.Service,Edge对应Edge路径下的Service,避免出现兼容报错
内容的提问来源于stack exchange,提问作者DABOUR دبور
相关产品推荐
相关产品推荐

