【问题标题】:How to ban object creation for a class without terminating the program?如何在不终止程序的情况下禁止为类创建对象?
【发布时间】:2015-12-26 20:32:10
【问题描述】:

所以我目前正在学习 python,我想知道是否有办法让一个类成为其他人的超类,而不允许直接从它创建对象。我尝试删除构造函数方法,但这并没有停止实例化,它只会使对象变为空白,我也尝试过引发错误,但这会终止程序,我不想这样做,从技术上讲,它不会阻止实例化它只是通过终止程序使对象无法访问。即:

class MySuperClass():
    def __init__(self):
        raise Exception("Cannot create object directly from base class")

我也尝试过尝试然后在其中引发异常

try:
    class MySuperClass():
        def __init__(self):
            raise ValueError
except:
    print("Cannot create object directly from base class")

这仍然没有停止对象的创建,我也尝试将这一行放在构造函数del self 中,但它似乎没有任何效果。有任何想法吗?提前致谢。

【问题讨论】:

  • 你到底想做什么?一个文档字符串“在实例化这个类之前三思而后行”怎么样?毕竟是 Python。
  • 如果您试图要求子类实现一个方法,请使用abc 模块
  • 你想让它做什么而不是停止程序?如果有人做了x = MySuperClass() 然后尝试用x 做某事(比如调用其他方法),你想发生什么?
  • 而不是创建它打印他们不应该并继续运行程序的其余部分
  • @MarwanSabry:不过,你不能那样做。如果“程序的其余部分”依赖于现有的x,则您无法运行程序的其余部分。一般来说,你不能直接跳到后面的操作而不完成前面的操作,因为当人们创建一个对象时,他们希望能够使用它,所以程序稍后会在事实证明他们不能使用时失败。跨度>

标签: python class oop python-3.x object


【解决方案1】:

Python 类有一个__new__ 方法,当您创建实例并返回该实例时会调用该方法。因此,以下代码将起作用。

class MySuperClass(object):
    def __new__(cls,*args):
        if cls is MySuperClass:
            return None
        return object.__new__(cls,*args)

任何创建MySuperClass 实例的尝试都会给你None。然而,子类可以被实例化。

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多