2014-10-10 71 views
0

如何访问从类构造函数到类函数的变量?从类构造函数访问变量到Python中的类函数

代码:

class evol: 
    k = 0 
    m = 0 

    def __init__(self, file1): 
     InFile = open(file1, 'rb') 
     InFile = csv.reader(InFile, delimiter='\t') 
     for rec in InFile: 
      self.k += int(rec[0]) 

    def method1(): 
     print k 

我得到的错误, NameError:全局名称 'K' 是没有定义

+0

你需要'def method(self):print self.k'。您可能熟悉其他使用'this'关键字的编程语言,它基本上就是这样。 “自我”只是传递自身参照的惯例。你也可以做'def method(self):print evol.k'。在python类中,可以像这样访问变量。在任何一种情况下,'method1'都需要param'self',以便它知道它的'绑定方法'而不是'static'或其他函数 – ZWiki 2014-10-10 16:00:06

+0

谢谢。当我使用evol.k访问method1()中的k时,它将打印在类下定义的初始值。但是,使用self.k,它将从构造函数中打印修改后的值。 – PyPerl 2014-10-10 16:10:58

+0

这是真的。在Python中,“类变量”将保留该类的值,并且可以通过该类进行修改。因为'__init__'下面的'self.k = 12'没有'self'作为参考,所以它不知道它是指谁。这就是为什么初始化'__init__'下的变量总是比较好的。 – ZWiki 2014-10-10 18:59:31

回答

0

您必须使用类变量的全名:

def method1(self): 
    print evol.k 

或者,因为您将其分配给self.k,您可能需要

def method1(self): 
    print self.k 

取而代之,这取决于你的意思是哪一个k

+0

谢谢。当我使用evol.k访问method1()中的k时,它将打印在类下定义的初始值。但是,使用self.k,它会从构造函数 – PyPerl 2014-10-10 16:11:13

+0

中输出修改后的值。另外,如果您希望提供默认值以防万一以后未提供另一个值,则最好将'self.k = 0'放入'__init__'中。为独立于实例的事物保留类变量,或者真正由所有实例共享。 – chepner 2014-10-10 16:30:25

0

我没有足够的代表添加评论,但是您确定要缩进代码吗?不过,你可以通过访问类变量“自我”的文章:

class evol: 
    k = 0 
    m = 0 

    def __init__(self, file1): 
     InFile = open(file1, 'rb') 
     InFile = csv.reader(InFile, delimiter='\t') 
     for rec in InFile: 
      self.k += int(rec[0]) 

    def method1(self): 
     print self.k 

如果不缩进代码,方法1()将是类以外的独立方法,所以它不会知道什么ķ

+0

这是行不通的。你需要'def method1(self)' – ZWiki 2014-10-10 15:57:08

+0

谢谢。由于我的名誉较低,我无法对此帖发表评论。 – PyPerl 2014-10-10 16:11:48