在 Python 中,如果你想禁止某个类被实例化,可以通过定义一个抽象基类并标记它为抽象类来实现。这样,任何尝试实例化该类的行为都会引发一个错误。以下是具体的做法:
使用 abc 模块定义抽象类
你可以使用 abc 模块中的 ABC 和 abstractmethod 来创建一个抽象类。这样的类不能被实例化,除非它的子类实现了所有的抽象方法。
示例代码
from abc import ABC, abstractmethod
# 定义一个抽象类
class AbstractClass(ABC):
@abstractmethod
def some_method(self):
pass
# 尝试实例化抽象类
try:
obj = AbstractClass()
except TypeError as e:
print(e) # 输出: Can't instantiate abstract class AbstractClass with abstract methods some_method
解释
-
导入模块:
from abc import ABC, abstractmethod -
定义抽象类:
class AbstractClass(ABC): @abstractmethod def some_method(self): passABC:表示这是一个抽象基类。@abstractmethod:标记some_method为抽象方法,这意味着任何继承自AbstractClass的子类都必须实现这个方法。
-
尝试实例化抽象类:
try: obj = AbstractClass() except TypeError as e: print(e)- 如果尝试实例化抽象类,将会触发
TypeError异常,提示不能实例化抽象类。
- 如果尝试实例化抽象类,将会触发
完整示例代码
from abc import ABC, abstractmethod
# 定义一个抽象类
class AbstractClass(ABC):
@abstractmethod
def some_method(self):
pass
# 尝试实例化抽象类
try:
obj = AbstractClass()
except TypeError as e:
print(e) # 输出: Can't instantiate abstract class AbstractClass with abstract methods some_method
输出
Can't instantiate abstract class AbstractClass with abstract methods some_method
通过这种方式,你可以确保抽象类不能被实例化,从而保证类的设计意图得到遵守。
下面还有四种让类不能被实例化或者调用的方法。最优推荐的还是abc的方法,以下都是毛招
from abc import ABC,abstractmethod
#第一种使用ABC,定义抽象类
class AbstractClass(ABC):
@abstractmethod
def speak(self):
pass
#第二种写法 重写__new__方法
class NonInstantiableClass:
def __new__(cls, *args, **kwargs):
raise TypeError("NonInstantiableClass cannot be instantiated")
# 第三种使用元组控制__call__方法
class NonInstantiableCallClass:
def __call__(self, *args, **kwargs):
raise TypeError(f"{type(self).__name__} cannot be called.")
#第四种就是重写__init__方法
class NonInstantiableInitClass:
def __init__(self):
raise TypeError(f"{type(self).__name__} cannot be instantiated.")
#
if __name__ == '__main__':
# 尝试实例化抽象类
try:
a = AbstractClass()
except Exception as e:
print(e)
# 尝试实例化抽象类
try:
a = NonInstantiableClass()
except Exception as e:
print(e)
#尝试实例化类
try:
obj = NonInstantiableInitClass()
except TypeError as e:
print(e) # 输出: NonInstantiableInitClass cannot be instantiated.
# 尝试调用类实例
try:
obj = NonInstantiableCallClass()
obj()
except TypeError as e:
print(e) # 输出: NonInstantiableCallClass cannot be called.

被折叠的 条评论
为什么被折叠?



