类函数中原因不明的python属性错误

时间:2014-03-15 08:25:06

标签: python attributeerror

首先,知道我QUADRUPLE CHECKED 我的身份。

以下是我的消息来源:

- MyClass.py -

class MyClass:
    def __init__(self, a,b):
        self.A = a
        self.B = b
    def __setattr__(self,name,value):
        print self
        print "setting value of " + name + " to " + str(value)
    def myTest(self):
        print self
        print "testing the value of self.A" + str(self.A)

- test.py -

from MyClass import MyClass
aClass=MyClass(1,2)
aClass.myTest()

我在这个目录中唯一的另一个文件是一个空的__init __。py

我有一个非常简单的测试程序,它导入MyClass并尝试通过只调用一个方法来使用它:myTest()。由于MyClass

,我收到此属性错误

我在使用python 2.7.5+的ubuntu linux上运行它,也尝试使用raspbmc在raspberry pi上运行,并且在Mac上也使用相同的结果。

user@machine:~$ python -tt test.py 
<MyClass.MyClass instance at 0xb746426c>
setting value of A to 1
<MyClass.MyClass instance at 0xb746426c>
setting value of B to 2
<MyClass.MyClass instance at 0xb746426c>
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    aClass.myTest()
  File "/home/user/MyClass.py", line 11, in myTest
    print "testing the value of self.A" + str(self.A)
AttributeError: MyClass instance has no attribute 'A'

2 个答案:

答案 0 :(得分:2)

您已覆盖__setattr__方法,但未在其中设置任何属性:

def __setattr__(self,name,value):
    print self
    print "setting value of " + name + " to " + str(value)
    object.__setattr__(self, name, value)

不要忘记让你的类继承自object,使它成为一个新式的类。

class MyClass(object):
    def __init__(self, a,b):
    ...

在旧式类中设置属性需要使用self.__dict__,对于新式类object.__setattr__(...)是推荐的方法。:

self.__dict__[name] = value

答案 1 :(得分:1)

您的__setattr__负责设置实例的属性,但除了打印某些消息之外没有做任何事情。当您重新实现__setattr__时,您必须编写设置属性的代码,python不会自动调用原始实现。将其更改为:

def __setattr__(self,name,value):
    print self
    print "setting value of " + name + " to " + str(value)
    self.__dict__[name] = value

请注意,由于您使用的是python2,最好从object继承:

class MyClass(object):

然后使用父类__setattr__方法完成工作:

def __setattr__(self,name,value):
    print self
    print "setting value of " + name + " to " + str(value)
    super(MyClass, self).__setattr__(name, value)