相关疑难解决方法(0)

静态类变量是否可能?

是否有可能在python中有静态类变量或方法?这样做需要什么语法?

python oop static class class-variables

1824
推荐指数
20
解决办法
114万
查看次数

什么是mixin,为什么它们有用?

在" 编程Python "中,Mark Lutz提到了"mixins".我来自C/C++/C#背景,我之前没有听过这个词.什么是mixin?

这个例子的行之间进行读取(我已经链接到了因为它很长),我假设这是一个使用多重继承来扩展类而不是"正确"子类的情况.这是正确的吗?

为什么我要这样做而不是将新功能放入子类?就此而言,为什么mixin/multiple继承方法比使用组合更好?

mixin与多重继承的区别是什么?这仅仅是语义问题吗?

python oop multiple-inheritance mixins

875
推荐指数
16
解决办法
27万
查看次数

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对象,所以类实例化必须做出魔法,但那有什么神奇之处呢?

python properties

72
推荐指数
3
解决办法
4万
查看次数

Python:常量类

我正在研究这个问题的答案: 是否可以在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类的行为类似于实际的常量吗?(我怀疑答案是否定的.)

python enums class

7
推荐指数
1
解决办法
1394
查看次数

什么时候应该继承EnumMeta而不是Enum?

本文中, Nick Coghlan讨论了PEP 435 Enum类型的一些设计决策,以及如何EnumMeta进行子类化以提供不同的Enum体验。

但是,我给出的建议(我是stdlib的主要Enum作者)关于使用元类的建议是,在没有充分好的理由的情况下不应该这样做-例如,无法使用类装饰器或专用工具来完成所需的工作隐藏任何丑陋的功能;而在我自己的工作,我已经能够做到我需要什么简单的使用__new____init__在创建时,和/或正常类/实例方法Enum类:

然后是一个警告性的故事,在研究Enum,有和没有元类子类化时要小心:

考虑到所有这些,我什么时候需要摆弄EnumMeta自己?

python enums metaclass

7
推荐指数
1
解决办法
1960
查看次数

Python中的枚举枚举?

是否可以在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)

python enums python-3.x

6
推荐指数
3
解决办法
4270
查看次数

How do define an attribute in Python 3 enum class that is NOT an enum value?

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 …

python enums python-3.x

6
推荐指数
1
解决办法
2885
查看次数

Python 中的枚举和属性

我是一名 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)

python java parameters enums constructor

5
推荐指数
1
解决办法
4036
查看次数

如何在内部跟踪 Python 枚举值?

我的最终目标实际上是在我的 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 enums python-3.x

5
推荐指数
1
解决办法
517
查看次数