相关疑难解决方法(0)

我怎样才能用Python代表'Enum'?

我主要是一名C#开发人员,但我目前正在使用Python开发一个项目.

我怎样才能在Python中表示Enum的等价物?

python enums python-3.x

1146
推荐指数
28
解决办法
80万
查看次数

在classmethods上使用property()

我有一个类有两个类方法(使用classmethod()函数)来获取和设置本质上是一个静态变量.我尝试使用property()函数,但它会导致错误.我能够在解释器中使用以下内容重现错误:

class Foo(object):
    _var = 5
    @classmethod
    def getvar(cls):
        return cls._var
    @classmethod
    def setvar(cls, value):
        cls._var = value
    var = property(getvar, setvar)
Run Code Online (Sandbox Code Playgroud)

我可以演示类方法,但它们不能作为属性:

>>> f = Foo()
>>> f.getvar()
5
>>> f.setvar(4)
>>> f.getvar()
4
>>> f.var
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: 'classmethod' object is not callable
>>> f.var=5
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: 'classmethod' object is not callable
Run Code Online (Sandbox Code Playgroud)

是否可以将property()函数与classmethod修饰函数一起使用?

python oop

152
推荐指数
9
解决办法
7万
查看次数

如何支持 Pybind11 创建的 Python 枚举的 len() 方法

假设我有一个像这样的 C++ 枚举:

enum class Kind {Kind1 = 1, Kind2, Kind3};
Run Code Online (Sandbox Code Playgroud)

要使用 Pybind11 将此枚举绑定到 Python 枚举中,我正在执行以下操作:

py::enum_<Kind>(py_module, "Kind")
   .value("Kind1", Kind::Kind1)
   .value("Kind2", Kind::Kind2)
   .value("Kind3", Kind::Kind3)
   .def("__len__", 
      [](Kind p) {
         return 3;
      });
Run Code Online (Sandbox Code Playgroud)

编译代码后,如果我询问枚举的长度,我将收到此错误:

>>> len(Kind)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'pybind11_type' has no len()
Run Code Online (Sandbox Code Playgroud)

我有什么想法可以解决它吗?

编辑1:我在 Visual Studio 2019 (C++17) 上使用 Pybind11 版本 2.10.1。

编辑 2:我希望具有与 Python 枚举中相同的行为:

>>> from enum import Enum
>>> class Kind(Enum):
...    kind1 = …
Run Code Online (Sandbox Code Playgroud)

c++ enums pybind11

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

标签 统计

enums ×2

python ×2

c++ ×1

oop ×1

pybind11 ×1

python-3.x ×1