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()方法...?
使用双下划线前缀:
(在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)
如果你想绝对确保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类实现时将引发异常。