V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yanyuechuixue
V2EX  ›  Python

各位大佬,求救一个 Python 问题,关于 Enum 的使用

  •  
  •   yanyuechuixue · 9 天前 · 735 次点击

    我写了一个程序,其中有一段是这样的:

    class Detector(Enum):
        BBO = "BBO"
        DECIGO = "DECIGO"
    
        @property
        def ell_max(self) -> int:
            ell_max = {
                Detector.BBO: 30,
                Detector.DECIGO: 30,
            }
            return ell_max[self]
    

    我现在需要在一个循环中改变 ell_max 的值,也就是不设置为 30 了,而是设置成其他值。我尝试过定义一个 def set_ell_max(self, ell_max) 但最终失败了。我的失败品如下:

    class Detector(Enum):
        BBO = "BBO"
        DECIGO = "DECIGO"
        _ell_max_values = {
            DECIGO: 30,
            BBO: 30,
        }
        @property
        def ell_max(self) -> int:
            return self._ell_max_values[self]
        
        def set_ell_max(self, value: int):
            self._ell_max_values[self] = value
    

    这种情况下,当我使用 Detector.BBO.ell_max 的时候,会提示 ```TypeError: 'Detector' object is not subscriptable

    
    请问各位大哥,我该怎么处理呀?
    第 1 条附言  ·  9 天前
    感谢 @ma46 大佬
    问题解决!

    是因为定义的字典被转换成枚举了,需要定义成私有的才不会被转换成枚举
    6 条回复
    laonger
        1
    laonger  
       9 天前
    self._ell_max_values[self.name]
    laonger
        2
    laonger  
       9 天前   ❤️ 1
    self._ell_max_values[self.name]

    试试?
    yanyuechuixue
        3
    yanyuechuixue  
    OP
       9 天前
    @laonger 还是不行。。

    ``` python
    58 @property
    59 def ell_max(self) -> int:
    ---> 60 return self._ell_max_values[self.name]

    TypeError: 'Detector' object is not subscriptable
    ```

    我想通过类继承的办法定义一个新的类,结果也不好使,说 Enum 的不允许再次继承。。。
    lyxxxh2
        4
    lyxxxh2  
       9 天前   ❤️ 1
    虽然我没用过 Python 的 Enum, 但是找 self 下标??? 第一次见。
    ```
    def set_ell_max(self, value: int):
    self._ell_max_values[DECIGO] = value
    return self
    ```
    ma46
        5
    ma46  
       9 天前   ❤️ 1
    私有名称才不会转为枚举类型, 所以变量名要用双下划线

    class Detector(Enum):
    BBO = "BBO"
    DECIGO = "DECIGO"

    __ell_max_values = {
    DECIGO: 30,
    BBO: 30,
    }

    @property
    def ell_max(self) -> int:
    print(self.__ell_max_values)
    return self.__ell_max_values[self.value]

    def set_ell_max(self, value: int):
    self.__ell_max_values[self.value] = value
    yanyuechuixue
        6
    yanyuechuixue  
    OP
       9 天前
    @ma46 谢谢!学到了,原来如此!

    十分感谢大佬!!

    问题解决!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3522 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:08 · PVG 19:08 · LAX 03:08 · JFK 06:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.