You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 دبور

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:27:24