Python10天冲刺--禁止类被实例化

在 Python 中,如果你想禁止某个类被实例化,可以通过定义一个抽象基类并标记它为抽象类来实现。这样,任何尝试实例化该类的行为都会引发一个错误。以下是具体的做法:

使用 abc 模块定义抽象类

你可以使用 abc 模块中的 ABCabstractmethod 来创建一个抽象类。这样的类不能被实例化,除非它的子类实现了所有的抽象方法。

示例代码
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

解释

  1. 导入模块

    from abc import ABC, abstractmethod
    
  2. 定义抽象类

    class AbstractClass(ABC):
        @abstractmethod
        def some_method(self):
            pass
    
    • ABC:表示这是一个抽象基类。
    • @abstractmethod:标记 some_method 为抽象方法,这意味着任何继承自 AbstractClass 的子类都必须实现这个方法。
  3. 尝试实例化抽象类

    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.

你可能感兴趣的:(python,前端)