Python-在python中,如何让类不能被继承,类似于php中的final类?

Python-在python中,如何让类不能被继承,类似于php中的final类?

夜无邪 发布于 2017-04-22 字数 75 浏览 1287 回复 2

在python中如何实现类似php的final修饰符,使其不能被继承,该如何实现?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浮生未歇 2017-06-11 2 楼

我认为所谓“禁止”继承某个类Foo,实际上只是需要当有其他类继承Foo时发出警报,提醒未正常使用该类的其他人。Python没有final这样简单的语言机制让你禁止类继承,但我们可以通过许多其他方式来实现。例如,良好的沟通或文档就能有效的防止其他人继承你的类;当然也可以让类‘自己’报警,这里提供一种供参考:

# test.py
class Father(object):
def __new__(cls, *args, **kwargs):
if cls != Father:
raise Exception("You should not inherit from Father; Got subclass(es): " + str(Father.__subclasses__()))
return super(Father, cls).__new__(cls, *args, **kwargs)

def __init__(self, x):
self.x = x

class Son(Father):
def __init__(self, x):
self.x = x

现在,试着使用这两个类:

>>> from test import *
>>> Father(10)
<test.Father object at 0x8fd128c>
>>> Son(10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 4, in __new__
raise Exception("You should not inherit from Father; Got subclass(es): " + str(Father.__subclasses__()))
Exception: You should not inherit from Father; Got subclass(es): [<class 'test.Son'>]
>>>

可以看到,Father类可以正常使用,但继承Father的Son类则不能正常使用。其原理是,当新建类实例时,python将首先调用其父类的__new__函数, 并以其自身的__class__为参数,所以在新建Father实例时,Father.__new__的cls参数值为Father; 而新建Son实例时, Son也将调用Father.__new__,但cls参数值为Son,这样就能够判断是否存在Father的子类。

偏爱自由 2017-06-06 1 楼

Python的类是没有权限控制的,所有变量都可以被外面调用。Python可以让变量或方法私有化,就是在变量或方法前加上“__”(两个下划线),但这只是一种程序员的约定,并不是真正的私有化,在外面还是可以调用的。这样做主要还是考虑了让其具有灵活性吧。