是否有可能在python中有静态类变量或方法?这样做需要什么语法?
我已成功使用Python属性,但我不知道它们是如何工作的.如果我取消引用类之外的属性,我只得到一个类型的对象property
:
@property
def hello(): return "Hello, world!"
hello # <property object at 0x9870a8>
Run Code Online (Sandbox Code Playgroud)
但是如果我在一个类中放置一个属性,那么行为就会大不相同:
class Foo(object):
@property
def hello(self): return "Hello, world!"
Foo().hello # 'Hello, world!'
Run Code Online (Sandbox Code Playgroud)
我注意到unbound Foo.hello
仍然是property
对象,所以类实例化必须做出魔法,但那有什么神奇之处呢?
我正在研究这个问题的答案: 是否可以在Enum中定义一个类常量?
最让我感兴趣的是Ethan Furman答案中的Constant课程.
class Constant:
def __init__(self, value):
self.value = value
def __get__(self, *args):
return self.value
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.value)
Run Code Online (Sandbox Code Playgroud)
问题是关于Python 3.4,但我使用的是2.7.在答案中,Ethan将引力常数设置为Planet类的实例变量,如下所示:
G = Constant(6.67300E-11)
Run Code Online (Sandbox Code Playgroud)
我在2.7中对这个类的测试表明只输入G就是这样:
Out[49]: Constant(3)
Run Code Online (Sandbox Code Playgroud)
(我将它设置为3以便于测试时使用.这看起来像__repr__
输出给我,如果我错了,请纠正我.)
该值可通过G.value获得.但是,在Ethan的回答中他使用了
return self.G * self.mass / (self.radius * self.radius)
Run Code Online (Sandbox Code Playgroud)
这显然只有在__repr__
输出值返回时才有效.现在,如果我class Constant:
改为class Constant(int):
然后输入GI仍然得到__repr__
输出,但如果我输入G * 4
我得到的12
不是我得到的错误.(TypeError:*:'instance'和'int'不支持的操作数类型)
很明显像int对象这样的东西在调用时可以输出一个数字.有没有一种我想要的魔术方法可以让我为Constant类做这个?由于常量可以是字符串,整数或浮点数,因此我更倾向于使用1个处理它们的类,而不是扩展这些对象的3个单独的类.
该值也可通过G.value设置.我可以将其锁定,以便Constant类的行为类似于实际的常量吗?(我怀疑答案是否定的.)
在本文中, Nick Coghlan讨论了PEP 435 Enum
类型的一些设计决策,以及如何EnumMeta
进行子类化以提供不同的Enum
体验。
但是,我给出的建议(我是stdlib的主要Enum
作者)关于使用元类的建议是,在没有充分好的理由的情况下不应该这样做-例如,无法使用类装饰器或专用工具来完成所需的工作隐藏任何丑陋的功能;而在我自己的工作,我已经能够做到我需要什么简单的使用__new__
,__init__
在创建时,和/或正常类/实例方法Enum
类:
然后是一个警告性的故事,在研究Enum
,有和没有元类子类化时要小心:
考虑到所有这些,我什么时候需要摆弄EnumMeta
自己?
是否可以在Python中使用enum枚举?例如,我想拥有
enumA
enumB
elementA
elementB
enumC
elementC
elementD
Run Code Online (Sandbox Code Playgroud)
并且对我来说可以elementA
称为enumA.enumB.elementA
,或elementD
称为enumA.enumC.elementD
.
这可能吗?如果是这样,怎么样?
编辑:以天真的方式实施:
from enum import Enum
class EnumA(Enum):
class EnumB(Enum):
member = 0
print(EnumA)
print(EnumA.EnumB.member)
Run Code Online (Sandbox Code Playgroud)
它给:
<enum 'EnumA'>
Traceback (most recent call last):
File "Maps.py", line 15, in <module>
print(EnumA.EnumB.member)
AttributeError: 'EnumA' object has no attribute 'member'
Run Code Online (Sandbox Code Playgroud) How to define an attribute in a Python 3 enum class that is NOT an enum value?
class Color(Enum):
red = 0
blue = 1
violet = 2
foo = 'this is a regular attribute'
bar = 55 # this is also a regular attribute
Run Code Online (Sandbox Code Playgroud)
But this seems to fail for me. It seems that Color tries to include foo and bar as part of its enum values.
EDIT: Lest you think I'm not using Enum in a way that's …
我是一名 Java 开发人员,但现在正在开发一个 Python 项目。是否可以编写一个其构造函数具有属性的枚举?
我会用Java这样做。
public class Main {
private enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6),
MARS(6.421e+23, 3.3972e6),
JUPITER(1.9e+27, 7.1492e7),
SATURN(5.688e+26, 6.0268e7),
URANUS(8.686e+25, 2.5559e7),
NEPTUNE(1.024e+26, 2.4746e7);
private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
@Override
public String toString() {
return super.toString() + " radius: " + radius + ", mass: " + mass;
}
}
public static void …
Run Code Online (Sandbox Code Playgroud) 我的最终目标实际上是在我的 Enum 类中创建一个辅助方法,该方法总是返回一个 Enum 成员并且从不引发异常,给定任何可能的值,例如
Color.from_value('red')
Run Code Online (Sandbox Code Playgroud)
如果该值不是枚举的一部分,则辅助方法将返回一个默认值,例如Color.UNKNOWN
。
根据另一个相关问题的答案,我可以通过一些内置成员列出这些值来检查这些值。但是,我接下来要做的是跟踪内部成员中的所有值,这样我就不必每次调用辅助方法时都遍历这些值。我尝试做类似以下的事情:
class Color(Enum):
RED = 'red'
BLUE = 'blue'
GREEN = 'green'
# this doesn't work
_values = [item.value for item in Color]
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它不起作用。这可能是 Python 枚举中已经内置的东西吗?
python ×9
enums ×6
python-3.x ×3
class ×2
oop ×2
constructor ×1
java ×1
metaclass ×1
mixins ×1
parameters ×1
properties ×1
static ×1