如何在python实例方法中创建静态局部变量?

时间:2014-10-05 17:43:31

标签: python oop

我来自C / C ++世界,并且很难在python中制作所有OOP类比。我将我的脚本包装在一个课程中,现在我的log()'私人'实例方法:

AttributeError: 'instancemethod' object has no attribute 'counter'

def __log(self, contents):                                                  
    sys.stdout.write(contents)                                              

    # Append all writes after the first                                     
    if not hasattr(self.__log, "counter"):                                  
        self.__log.counter = 1                                              
        f = open(self.output_filepath, 'w')                                 
    else :                                                                  
        f = open(self.output_filepath, 'a')                                 

    f.write(contents)                                                       
    f.close()   

3 个答案:

答案 0 :(得分:1)

self.__log.counter引用counter方法中不存在的__log变量。

如果您需要将counter变量作为对象实例的一部分,请通过self.counter

引用它

如果您需要counter对类是静态的,请在任何方法之外的类定义中定义变量。检查this问题

如果你真的需要counter变量作为实例方法的一部分,那么引用它的方法是通过ClassName.__log.counter

开始学习python中的OO概念的好地方是python文档。 https://docs.python.org/2/tutorial/classes.html

答案 1 :(得分:-1)

您无法向方法添加属性,但您可以修改其 dict 属性:

class Test:
    def __log(self, contents):                                                  
        sys.stdout.write(contents)                                              

        # Append all writes after the first                                     
        if not "counter" in self.__log.__func__.__dict__:                                  
            self.__log.__func__.__dict__["counter"]= 1                                              
            f = open(self.output_filepath, 'w')  
            print 'w'                               
        else :                                                                  
            f = open(self.output_filepath, 'a') 
            print 'a'                               

        f.write(contents)                                                       
        f.close()  

a = Test()
a._Test__log('') #Prints w
a._Test__log('') #Prints a
b = Test()
b._Test_log('') #Prints a

答案 2 :(得分:-1)

Python没有静态局部变量。您想要的最佳解决方案是使用类属性:

class WithLog(object):

    opened = False

    def log(self, contents):                                                  
        sys.stdout.write(contents)                                              

        mode = "a" if self.__class__.opened else "w"
        with open(self.output_filepath, mode) as f:
            f.write(contents)       

        self.__class__.opened = True

当然,最好不要经常打开和关闭日志文件....