繁体   English   中英

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

[英]How can this global class variable be pep8 compliant and still work?

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更改为global cls.cartridge_state 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属性:

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

PEP 8所说的是, cls应该是第一个论点。 在实例方法中定义第一个参数self ,方法相同。 我想这是为了避免在您调用诸如self.yourclassmethod()这样的类方法时遇到麻烦。 但是我看不到为什么必须@classmethod装饰器。

编辑:

我这样做是不同的,而不是@classmethod我用@staticmethod ,但我知道,我们不是在谈论同样的事情。 如果有人认为我错了,请告诉我。

例:

class Bar(object):
    @staticmethod
    def foo(myarg):
        return myarg * 2

Bar.foo(2)

编辑2:

我纠正自己, @classmethod@staticmethod代表不同的东西(请参阅此处 )。 静态方法不应修改类中的变量。

忘记global ; global与类和对象无关。

当您访问对象的属性时,将首先在对象上查找该属性,然后在类上对其进行查找。 这意味着,如果您希望对象拥有自己的属性副本,而又不反映该类在该类上对该属性的后续更新,则只需将其复制到__init__

def __init__(self):
    self.prop = self.prop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM