我来自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()
答案 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
当然,最好不要经常打开和关闭日志文件....