在python中使变量不可继承

Emm*_*mma 3 python inheritance

有没有办法在python中使变量不可继承?如下例所示:B是A的子类,但我希望它具有自己的SIZE值.

如果B不覆盖SIZE,是否可以获得引发错误(在__init__或getsize()上)?

class A:
   SIZE = 5
   def getsize(self): return self.SIZE

class B(A): pass
Run Code Online (Sandbox Code Playgroud)

编辑:...继承getsize()方法...?

Ric*_*dle 8

使用双下划线前缀:

(在Emma澄清后删除了双下划线解决方案)

好的,你可以这样做:

class A:
    SIZE = 5
    def __init__(self):
        if self.__class__ != A:
            del self.SIZE

    def getsize(self):
        return self.SIZE

class B(A):
    pass

a = A()
print a.getsize()
# Prints 5

b = B()
print b.getsize()
# AttributeError: B instance has no attribute 'SIZE'
Run Code Online (Sandbox Code Playgroud)


Ste*_*eef 5

如果你想绝对确保Aoverride 的子类SIZE,你可以使用元类,A当子类没有覆盖它时会引发错误(注意A这里是一个新式类):

class ClassWithSize(type):
    def __init__(cls, name, bases, attrs):
        if 'SIZE' not in attrs:
            raise NotImplementedError('The "%s" class does not implement a "SIZE" attribute' % name)
        super(ClassWithSize, cls).__init__(name, bases, attrs)

class A(object):
    __metaclass__ = ClassWithSize

    SIZE = 5
    def getsize(self):
        return self.SIZE

class B(A):
    SIZE = 6

class C(A):
    pass
Run Code Online (Sandbox Code Playgroud)

当您将上述内容放入模块并尝试导入它时,当导入到达C类实现时将引发异常。

  • @Emma:它看起来并不优雅,因为——通常——它没有必要。我们都是成年人。只需查看子类代码并确保它覆盖了 SIZE。查看代码要简单得多,也更优雅。 (3认同)