[英]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.