首先,知道我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'
答案 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)