在python类中定义常量,真的需要self吗?
我想在类中定义一组常量,例如:
class Foo(object):
(NONEXISTING,VAGUE,CONFIRMED) = (0,1,2)
def __init__(self):
self.status = VAGUE
但是,我得到了
NameError: global name 'VAGUE' is not defined
是否有一种方法可以将这些常量定义为在类中可见,而无需借助 global
或 self.NONEXISTING = 0 等?
I want to define a set of constants in a class like:
class Foo(object):
(NONEXISTING,VAGUE,CONFIRMED) = (0,1,2)
def __init__(self):
self.status = VAGUE
However, I get
NameError: global name 'VAGUE' is not defined
Is there a way of defining these constants to be visiable inside the class without resorting to global
or self.NONEXISTING = 0
etc.?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
当您在类主体中分配名称时,您正在创建该类的属性。如果不直接或间接引用该类,则无法引用它们。您可以使用
Foo.VAGUE
正如其他答案所说,或者您可以使用self.VAGUE
。您不必分配给self
的属性。通常,使用 self.VAGUE 是您想要的,因为它允许子类重新定义属性,而不必重新实现使用它们的所有方法 - 在这个特定的情况下,这似乎不是明智的做法例子,但谁知道呢。
When you assign to names in the class body, you're creating attributes of the class. You can't refer to them without referring to the class either directly or indirectly. You can use
Foo.VAGUE
as the other answers say, or you can useself.VAGUE
. You do not have to assign to attributes ofself
.Usually, using
self.VAGUE
is what you want because it allows subclasses to redefine the attribute without having to reimplement all the methods that use them -- not that that seems like a sensible thing to do in this particular example, but who knows.尝试代替:
这个:
你必须指定类
try instead of:
this one:
you MUST specify the class
无论如何,都不建议任何代码使用此方法,但是可以完成如下所示的丑陋的黑客攻击。
我这样做只是为了更好地理解 Python AST API,所以任何在现实代码中使用它的人都应该在它造成任何伤害之前被枪杀:-)
This one is NOT RECOMMENDED FOR ANY CODE by any means, but an ugly hack like below can be done.
I did this just to have better understanding of Python AST API, so anyone who uses this in real-world code should be shot before it does any harm :-)
唯一的方法是通过类名访问它,例如
如果仅访问 __init__ 函数或函数内的 VAGUE,则必须在其中声明它才能以您想要的方式访问它。
使用 self 也适用于类的实例。
The only way is to access it through the class name such as
If accessing just VAGUE inside the
__init__
function, or a function, it must be declared inside that to access it the way you want.Using self is for the instance of the class also.
在Python3中,您还可以引用
VAGUE
:这样,您可以清楚地将其作为类属性而不是对象属性进行引用,但这种方式对于类的名称更改来说是稳健的。此外,如果您在子类中重写
VAGUE
,则将使用子类中的值,就像您使用self.VAGUE
一样。请注意,此方法似乎在 Python2 中不起作用,至少在我的测试中不起作用,其中
type(self)
返回instance
而不是我实例化的类。因此,考虑到 Python2 仍然广泛传播,Thomas Wouters 的答案可能更可取。In Python3, you can also reference
VAGUE
as:This way, you are clearly referencing it as a class attribute and not an object attribute, yet this way is robust against a name change of the class. Also if you override
VAGUE
in a subclass, the value from the subclass will be used, just like if you were to useself.VAGUE
.Note that this method does not appear to work in Python2, at least not in my tests, where
type(self)
returnedinstance
instead of the class I instantiated. Therefore Thomas Wouters's answer is probably preferable, considering how widespread Python2 still is.