当我运行这个(2.7.3)时,我得到了这个输出:
'Slotted1' object has no attribute 'c'
attribute c added to <class '__main__.Slotted2'>
我不明白Slotted1和Slotted2之间的行为差异。谁能解释一下?
from ctypes import *
class BracedStructure(Structure):
def __init__(self, **args):
super(BracedStructure,self).__init__(**args)
class Slotted1(Structure):
__slots__ = ['a','b']
_fields_ = [('a',c_int8),('b',c_int8)]
def __init__(self, **args):
super(Slotted1,self).__init__(**args)
def attemptToAddField(self):
self.c = '?'
print 'attribute c added to %s' % self.__class__
class Slotted2(BracedStructure):
__slots__ = ['a','b']
_fields_ = [('a',c_int8),('b',c_int8)]
def __init__(self, **args):
super(Slotted2,self).__init__(**args)
def attemptToAddField(self):
self.c = '?'
print 'attribute c added to %s' % self.__class__
if '__main__' == __name__:
s1 = Slotted1(a=1,b=2)
try:
s1.attemptToAddField()
except AttributeError as e:
print e
s2 = Slotted2(a=1,b=2)
try:
s2.attemptToAddField()
except AttributeError as e:
print e
答案 0 :(得分:2)
检查出来:http://docs.python.org/reference/datamodel.html#slots
从没有
__slots__
的类继承时,该类的__dict__
属性将始终可访问,因此子类中的__slots__
定义毫无意义。
BracedStructure没有__slots__
,因此它取代了__slots__
中的Slotted2
声明。
答案 1 :(得分:0)
这是因为Slotted2
继承了__dict__
的{{1}}属性。因此无论BracedStructure