【问题标题】:Class variable initialization in pythonpython中的类变量初始化
【发布时间】:2015-08-24 05:44:28
【问题描述】:

我有一个带有变量的类,它应该是这个类的一个实例。我无法在声明行创建实例,因为 python 解释器此时不知道如何构造对象。有一个可能的解决方法:在类声明之后初始化。

class A(object):
    static_variable = None

    def some_method(self, a=static_variable):
       print a

A.static_variable = A()

但我需要使用该类变量作为默认参数。可以这样解决问题:

def some_method(self, a=None):
    a = a if a else A.static_variable
    print a

但是,对我来说,它看起来非常非 Python。任何关于如何使用这种静态变量作为默认参数的建议都将不胜感激。

【问题讨论】:

  • 使用param=None 然后测试if parem is None 绝对是pythonic。
  • 为什么实例需要是类的变量呢?为什么不简单地在模块级别定义它?
  • @DanielRoseman 是的,我可以在模块级别定义它,但它仍然不能解决默认参数的问题。
  • @MartijnPieters 恕我直言def f(a=2): print adef f(a=None): a = a if a 2; print a 相比更具pythonic 风格
  • @midas:当默认值是可变的并因此在所有函数调用之间共享时不会。

标签: python oop static static-variables


【解决方案1】:

Python 不支持像 C++ 这样的语言所支持的“静态”变量。所以在这种情况下,'static_variable'实际上是一个类变量,这就是你遇到这个问题的原因。我敢肯定你已经知道这一点,但其他人可能有一天会偶然发现我们称它为静态变量,所以看起来我们应该为后代澄清这一点。

我在想,既然 'static_variable' 仍然是 A 类的成员,那么也许有办法完全不使用它作为参数。

你能在 some_method() 中使用关键字参数吗?

如果不使用 kwarg,您可以只调用变量“A.static_variable”,而不是将其用作函数的默认参数。

class A(object):
    static_variable = None

    def some_method(self, *, a=None):
        if a:
            print(a)
        else:
            print(A.static_variable)

A.static_variable = A()

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 2020-03-18
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2015-04-22
    • 2012-07-04
    • 2016-09-07
    相关资源
    最近更新 更多