没有__init__的类中的类变量赋值

时间:2018-10-22 09:52:30

标签: python python-3.x class-variables

请考虑以下内容:

from module1 import foo_ext()

    class A(object):
        x = foo_ext()
        @classMethod
        def foo1():
          . . .
        @classMethod
        def foo2():
          . . .
        @classMethod
        def foo3():
          . . .

是否确实是,每次调用A.foo1()A.foo2() x类变量时,都不是通过调用foo_ext()来再次分配的,仅在第一次使用其某些类方法对“静态类” A进行一些调用:foo1foo2等?

2 个答案:

答案 0 :(得分:3)

  

是不是每次调用A.foo1()或A.foo2()x都不会通过调用foo_ext()再次分配类变量

当然可以,为什么???

  

仅在第一次使用其某些类方法:foo1,foo2等对“静态类” A进行调用时?

甚至没有。像class块顶层的所有语句一样,此语句也作为class语句执行的一部分进行评估,这是-假设class最常见的情况在模块的顶层(=>不在函数内)的语句-首次为给定进程导入模块时。

此:

class Foo(object):
   x = somefunc()

   def bar(self):
       print("foo")

   @staticmethod
   def baaz():
       print("quux")

实际上只是以下方面的语法糖:

x = somefunc()

def bar(self):
  print("foo")

def baaz():
   print("quux")

attribs = {
    "x" : x,
    "bar": bar,
    "baaz": staticmethod(baaz)
    }

del x
del bar
del baaz

Foo = type("Foo", (object,), attribs)

那么为什么您希望每次实例化x = somefunc()或调用Foobar时都执行baaz语句?

答案 1 :(得分:1)

问题在于您正在创建类属性而不是实例属性。

def in_here():
    print('Called')

    return True

class A:
    x = in_here()

    @classmethod
    def test(cls):
        print('In test')
        return cls.x


A.test()

这只会打印一次Called。 -因为类属性不会在每次调用类时都被重建,而是在执行时一次被重建。

如果您希望它多次运行,那为什么不使用__init__?或将class属性更改为属性?还是更好,只是在需要时调用该函数?