在类中从静态方法Python填充一次静态变量

在类中从静态方法Python填充一次静态变量,python,class,static-methods,static-variables,Python,Class,Static Methods,Static Variables,我在Python中有一个类a,我想填充一个调用静态方法的静态变量,如: Class A: arr = [] @staticmethod def FillArr(): #do more stuff but for semplicity... A.arr = [[2,2,2,]] FillArr.__func__() 当我运行代码时,我得到了'NameError:name A not defined',因此本质上我无法初始化arr静态变量。基本

我在Python中有一个类a,我想填充一个调用静态方法的静态变量,如:

Class A:
   arr = []

   @staticmethod
   def FillArr():
       #do more stuff but for semplicity...
       A.arr = [[2,2,2,]]

  FillArr.__func__()
当我运行代码时,我得到了'NameError:name A not defined',因此本质上我无法初始化arr静态变量。基本上,一旦类被实例化,一旦我想填充静态变量,使用@classmethod:

class A( object ):
  arr = []

  @classmethod
  def FillArr( cls ):
    cls.arr = [[2,2,2]]

A.FillArr()

print A.arr
这将导致:[[2,2,2]]

/编辑/ 我在下面的评论中提到的使用普通方法示例(基于Jacques的解释):

使用@classmethod:

class A( object ):
  arr = []

  @classmethod
  def FillArr( cls ):
    cls.arr = [[2,2,2]]

A.FillArr()

print A.arr
这将导致:[[2,2,2]]

/编辑/ 我在下面的评论中提到的使用普通方法示例(基于Jacques的解释):


这在Python 3.6上完美地运行:

class A:
   arr = []

   @staticmethod
   def fillArr():
       #do more stuff but for simplicity...
       A.arr = [[2,2,2,]]

A.fillArr()

print (A.arr)
或者,在您的评论中添加额外信息:

class A:
    arr = []

    @staticmethod
    def fillArr():
        #do more stuff but for simplicity...
        A.arr = [[2,2,2,]]

    def __init__ (self):
        if not A.arr:
           A.fillArr ()

A ()

print (A.arr)

这在Python 3.6上完美地运行:

class A:
   arr = []

   @staticmethod
   def fillArr():
       #do more stuff but for simplicity...
       A.arr = [[2,2,2,]]

A.fillArr()

print (A.arr)
或者,在您的评论中添加额外信息:

class A:
    arr = []

    @staticmethod
    def fillArr():
        #do more stuff but for simplicity...
        A.arr = [[2,2,2,]]

    def __init__ (self):
        if not A.arr:
           A.fillArr ()

A ()

print (A.arr)

不。。我需要在类内而不是类外填充。。。基本上,一旦类被实例化,我就会填充静态variable@Jacques:lol当我突然在自己的帖子上看到编辑内容时,我已经很惊讶了;-)@ai2016:Jacques发布的staticmethod解决方案也可以通过classmethod完成。这正是您喜欢的:您想在方法中明确地使用类的名称而不是使用staticmethod吗?如果您想使用cls(不要与self混淆,后者是为实例类保留的),请使用classmethod。但是你甚至可以用一个普通的方法,用self替换cls,并在init中调用self.FillArr。老实说,我更喜欢classmethod,因为它不依赖于类的名称,而类的名称很容易改变,而第一个参数按照惯例几乎总是命名为cls。只是逐字逐句地回答了这个问题。没有。。我需要在类内而不是类外填充。。。基本上,一旦类被实例化,我就会填充静态variable@Jacques:lol当我突然在自己的帖子上看到编辑内容时,我已经很惊讶了;-)@ai2016:Jacques发布的staticmethod解决方案也可以通过classmethod完成。这正是您喜欢的:您想在方法中明确地使用类的名称而不是使用staticmethod吗?如果您想使用cls(不要与self混淆,后者是为实例类保留的),请使用classmethod。但是你甚至可以用一个普通的方法,用self替换cls,并在init中调用self.FillArr。老实说,我更喜欢classmethod,因为它不依赖于类的名称,而类的名称很容易改变,而第一个参数按照惯例几乎总是命名为cls。我接受了这个问题,但我需要添加一个布尔值,让它在我重新测试后执行,但在我的系统上(win10,python3.6,未经修改运行,打印[[2,2,2]]。好奇您必须在哪里添加布尔值…是的,因为您的代码只有一个实例,如果有多个实例,您应该注意diffOk,您只想填充它一次。了解。将进行编辑。确定我接受了,但我需要添加一个布尔值,以便在我重新测试后在我的系统上执行它(win10,python3.6它运行时未经修改,正在打印[[2,2,2]]。很好奇您必须在哪里添加布尔值…是的,因为您的代码只有一个实例,如果有多个实例,您应该注意diffOk,您只想填充它一次。了解。将进行编辑。