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

本文探讨了如何在Python中模拟实现禁止类继承的功能,通过修改`__new__`方法来检测并阻止对特定类的继承。作者提供了一个示例代码,当尝试继承指定类时会抛出异常,从而达到防止继承的目的。这种方法结合良好的沟通和文档,可以有效地限制类的使用方式。
摘要由CSDN通过智能技术生成

我认为所谓“禁止”继承某个类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)

>>> Son(10)

Traceback (most recent call last):

File "", line 1, in

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): []

>>>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值