Skip to main content
 首页 » 编程设计

python之这个全局类变量如何兼容 pep8 并且仍然有效

2025年05月04日18rubylouvre

Pep8建议始终使用 cls 作为类方法定义的第一个参数。 现在假设我想使用一个类变量(在本例中:cls.cartridge_state),它也可以在实例方法中使用(在本例中:__init__)。因此,为此我需要将变量设置为全局变量(参见下面的代码)。但是实例化 FountainPen 会产生以下运行时错误:

self.cartridge_state = cls.cartridge_state 
NameError: global name 'cls' is not defined 

但是当我再次将 global cartridge_state 更改为 global cls.cartridge_state 时,我在尝试导入模块时遇到语法错误。

class FountainPen(object): 
    cartridge_ink = "water-based" 
    @classmethod 
    def toggle_default_cartridge_state(cls): 
        i = 0 
        cartridge_states = ['non-empty','empty'] 
        global cartridge_state 
        cls.cartridge_state = cartridge_states[i] 
        i += 1 
 
    def __init__(self): 
        self.cartridge_state = cls.cartridge_state 
        global number_of_refills 
        self.number_of_refills = 0 
 
    def write(self): 
        print Pen.write(self) 
        self.cartridge_state = "empty" 
        return self.cartridge_state 
 
    def refill(self): 
        self.cartridge_state = "non-empty" 
        self.number_of_refills += 1 

如何让类变量 cartridge_state 符合 pep8 并使此代码正常运行?

请您参考如下方法:

类属性可以通过self读取:

class FountainPen(object): 
    cartridge_ink = "water-based" 
    default_cartridge_state = "empty" 
 
    @classmethod 
    def toggle_default_cartridge_state(cls): 
        if cls.default_cartridge_state == "empty": 
            cls.default_cartridge_state = "non-empty"   
        else: 
            cls.default_cartridge_state = "empty" 
 
    def __init__(self): 
        self.cartridge_state = self.default_cartridge_state 
 
    def write(self): 
        print Pen.write(self) 
        self.cartridge_state = "empty" 
        return self.cartridge_state 
 
    def refill(self): 
        self.cartridge_state = "non-empty" 
        self.number_of_refills += 1