【问题标题】:Using class variable as non-default argument in python在python中使用类变量作为非默认参数
【发布时间】:2011-06-05 23:57:29
【问题描述】:

有没有办法在类中保留一个私有类变量,并仍然将其用作非默认变量的默认值(之前不定义该值,在类之外)?

示例:

class a:
    def __init__(self):
        self.__variable = 6
    def b(self, value = self.__variable):
        print value

【问题讨论】:

  • Python没有有私有类变量。完全没有。您使用的双下划线 not 使变量私有,它只是进行名称修改以避免名称冲突。除非您知道为什么必须使用双下划线,否则不要使用双下划线。 ;)
  • 好问题! (嗯,它解决了我遇到的一个大问题,所以......)

标签: python class variables default-value


【解决方案1】:

你想太多了:

class a:

    def __init__(self):
        self.__variable = 6

    def b(self, value=None):
        if value is None:
            value = self.__variable
        print value

【讨论】:

    【解决方案2】:
    1. self.__variable 是实例变量,而不是类变量。
    2. 因为默认参数是在 function方法定义时评估的,所以您不能使用实例变量作为默认参数 - 至少不能直接使用(通常的技巧,默认为 None 并添加 @ 987654325@ 到函数体,确实有效)。
    3. 前导双下划线并不意味着“私人”,它们的意思是“名称修改和自找麻烦”。如果你不明白我的意思,你根本不应该使用这个“功能”。预期用途是不是私人成员 - 为此使用一个下划线。

    【讨论】:

    • 那么,的预期用途是什么?
    • @Karl:防止子类中的名称冲突。参见例如docs.python.org/reference/…docs.python.org/tutorial/…(第三段)。
    • 如果我只使用 1 个子分数,我仍然可以访问变量
    • @calccrypto:是的,当然。为什么不?实际上,反之亦然:你不能 - 理智地 - 在类定义之外的任何地方访问__variable(由于名称修改)。这就是为什么我强烈建议你去掉一个下划线。
    • @calccrypto 是的,没关系。 Python 是建立在这样的假设之上的:我们都是成年人,他们明白在没有明确许可(来自该类的文档)的情况下访问另一个类的变量是很顽皮的。 (即使那样,我们现在也有 property 包装器,而不是仅仅授予权限。)如果我想要那种级别的编译时检查,我不会使用动态类型语言。
    【解决方案3】:

    值得补充的是,如果您希望 None 在允许的参数范围内,您可以创建一个不会在您的代码中用于任何其他目的的自定义标记值。如果不这样做,valueNone 将永远无法从b 返回。

    UseDefault = object()
    
    # Python 3? Otherwise, you should inherit from object unless you explicitly
    # know otherwise.
    class a:    
        def __init__(self):
            self._variable = 6
    
        def b(self, value=UseDefault):
            if value is UseDefault:
                value = self._variable
            print value
    

    现在None 可以传递给b 而不会导致使用默认值。`

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 2012-08-01
      • 1970-01-01
      • 2020-11-27
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      相关资源
      最近更新 更多