【问题标题】:How to forbid direct object creation?如何禁止直接创建对象?
【发布时间】:2022-07-04 14:23:43
【问题描述】:

如何在 Python 3 中禁止直接创建对象?

class A:
    def create(self):
        return B()

class B:
    pass

b = B()  # FORBIDDEN

a = A()
a.create() # ALLOWED

【问题讨论】:

  • 为什么你想这样做?这可能是XY problem
  • 您可能会尝试在您的 B 类中定义 B.__init__(self, a = false) 如果 a 为 false,则会引发异常。在 A.create() 中,您可以调用 B(true) 而不是 B()。所以调用 B() 会引发异常。你为什么要这样做?
  • 在python中你永远不能真正禁止事情,只是最终让它变得更烦人,但真正的问题确实是你为什么需要它,看起来像一个X-Y问题;)
  • 我只想将这种方式的 api 提供给即时 B(),以避免 B() 出现一些不需要的参数。
  • 您可以使用与创建单例相同的方法(请参阅stackoverflow.com/questions/6760685/…

标签: python


【解决方案1】:

我认为除此之外可能还有其他方法可以解决您的问题,但是实现问题中所述目标的一种方法是使用inspect 模块并强制__init__ 在以下情况下引发异常它不是从特定的classmethod 调用的。

例如:

import inspect

class A:
    def __init__(self):
        stack = inspect.stack()
        classvar, klas = list(stack[1].frame.f_locals.items())[0]
        if stack[1].function != 'create' and klas != type(self):
            raise Exception
   
    def __str__(self):
        return "Success"

    @classmethod
    def create(cls):
        result = cls()
        return result

a1 = A.create() # Returns instance of A
print(a1)       # prints "Success"

a2 = A()   # Throws Exception

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多