python - __slots__、_fields_ 和继承的交叉点出现异常

标签 python inheritance field slots

当我运行这个(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

最佳答案

看看这个:http://docs.python.org/reference/datamodel.html#slots

When inheriting from a class without __slots__, the __dict__ attribute of that class will always be accessible, so a __slots__ definition in the subclass is meaningless.

碰巧 BracedStructure 没有 __slots__,因此它覆盖了 Slotted2 中的 __slots__ 声明。

关于python - __slots__、_fields_ 和继承的交叉点出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11818711/

相关文章:

java - 为什么 Java 不允许扩展数组类型

java - Genson 1.4 (JSON) 不处理继承的 Pojo 的

django - 使BooleanField在Django中显示更大的复选框

awk - 比较连续行中不在同一列的两个字段

python - 如何在 Windows 中获取文本光标位置?

python - 如何在代码中按降序减去星号?

python - 使用 Django Allauth 注册 Facebook 用户

python - 如何在 Solaris 上安装 64 位 Python?

objective-c - objective-c - 制作一个 NSManagedObject 和从同一父类继承的常规 NSObject 类

jquery - 如何在提交前向表单添加其他字段?