【问题标题】:How to store methods of the class A in const dictionary of the class A?如何将 A 类的方法存储在 A 类的 const 字典中?
【发布时间】:2020-02-04 05:59:18
【问题描述】:

假设我们将 A 类定义为

class A:
   KEY_A = "KEY_A"
   KEY_B = "KEY_B"

   __methodDict = {KEY_A : __method_a,
                 KEY_B : __method_b}

   def __init__(self):
     self.variableABC = 'ABC'

   def __method_a(self):
      print("method a")

   def __method_b(self):
      print("method b")

当上面的代码运行时,编译时错误会提示用户__method_a 不存在。不,这不是因为 python 对 A 类的内部结构一无所知。

那么,我的问题是,如何将 __methodDict 定义为 A 类的常量来存储 A 类的 __method_a 和 method_b?

【问题讨论】:

  • 您可以通过使用@classmethod 装饰这些方法来使它们成为类方法,然后将它们引用为A.__method_a。但是,这限制了那里的使用。如果您需要它们作为实例方法,您可以定义一个初始化器 __init__ 并在其中设置 self.__methodDict = { ... self.__method_a ... }
  • @rayepps 当时A 没有定义
  • 尝试在__methodDict定义之前移动引用的方法,它现在应该可以工作了
  • @dcg,谢谢!确实有效!

标签: python class dictionary constants


【解决方案1】:

没有发生编译时错误。你看到的是一个运行时错误,一个NameError。这里要理解的关键事实是类定义语句不是声明,它是可执行代码,您可以将其视为调用type 构造函数的语法糖。一个类只是一个对象,就像任何其他对象一样。在这种情况下,您可以通过在定义方法后移动 dict 定义来修复您的名称错误:

class A:
   KEY_A = "KEY_A"
   KEY_B = "KEY_B"

   def __init__(self):
     self.variableABC = 'ABC'

   def __method_a(self):
      print("method a")

   def __method_b(self):
      print("method b")

   __methodDict = {KEY_A : __method_a,
                 KEY_B : __method_b}

这将在没有运行时 NameError 的情况下运行

注意,Python 没有常量。而且我可能还应该提到,双下划线名称修饰与私有变量不同,它可以防止子类中的名称冲突。所以那些双下划线可能没有必要。

【讨论】:

  • 是的,虽然双下划线并不意味着方法是私有的,但它仍然可以帮助区分公共和私有的方法。这是我在 python 中最缺少的东西。以及常量。
  • @user1415536​​ 通常,single 下划线表示“私有”,即不属于公共 API 的内容。
  • 我的错误。我可能应该再次阅读风格指南。距离我上次使用 python 已经有一段时间了。
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 2017-01-03
  • 2020-04-01
相关资源
最近更新 更多