代码之家  ›  专栏  ›  技术社区  ›  Serge Rogatch

类变量在Python中何时初始化?

  •  2
  • Serge Rogatch  · 技术社区  · 7 年前

    考虑下面的Python 3代码:

    class A:
        b = LongRunningFunctionWithSideEffects()
    

    LongRunningFunctionWithSideEffects() 被叫来?在导入模块时?或者在这个时候,这个类第一次以某种方式被使用?

    3 回复  |  直到 7 年前
        1
  •  15
  •   Paweł Kordowski    7 年前

    此时模块已导入

    test.py :

    def x():
        print('x')
    
    class A:
        x = x()
    

    Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
    [GCC 8.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import test
    x
    
        2
  •  7
  •   user2864740 Heinzi    7 年前

    类中的代码在 class 遇到语句-即在导入过程中。

    这是因为,与Java或C#类定义不同,Python 班 语句实际上是可执行代码。

    class A:
      print("I'm running!") # yup, code outside a method or field assignment!
      b = print("Me too!")
    
    print("Wait for me!")
    

    结果按执行顺序排列整齐:

    I'm running!
    Me too!
    Wait for me!
    
        3
  •  2
  •   solver149    7 年前

    这是在导入时完成的。这些变量称为静态变量,在类级别定义。每个类创建一个变量,而不是每个对象创建一个变量。它们是在导入时加载类的一部分。

    以下是一个例子:

    class A:
        print("Printing before Static Variable Creation")
        class_var = 1
    
        def __init__(self):
            instance_var = 2
    

    main.py

    from classA import A
    

    在创建静态变量之前打印

    print('Printing Class Variable Value : ',A.class_var)
    

    print(A.__dict__)
    

    {' 单元 ' 初始化 ':函数类A.A。 初始化 (自我), ' 字典 “:属性” “A”对象的, ' 威克雷夫 “:属性” 威克雷夫 “A”对象的, 医生