【问题标题】:Get name of module that is instantiating my class [duplicate]获取实例化我的类的模块的名称[重复]
【发布时间】:2019-01-13 05:48:56
【问题描述】:

我正在编辑一些由我无法控制的另一个系统调用的代码。这个系统从几个不同的地方初始化我的班级。我需要根据我的班级从哪里调用来执行不同的事情。 有没有办法可以找到我的对象正在初始化的位置?

A.py:

class InitializerA:
    def calling_function(self):
        Called()

class InitializerB:
    def calling_function(self):
        Called()

B.py:

class Called:
    def __init__(self):
        # I want to know here whether it is being called by InitializerA or InitializerB

【问题讨论】:

  • 你为什么要那个?在什么情况下会有用?
  • 被调用者可以根据谁调用它来做不同的事情。不幸的是,这是一些需要修改的遗留代码,我无法向初始化程序添加新参数。
  • 这似乎是一个糟糕的设计,是什么导致的?目前是如何处理的?
  • 同意,这并不理想。最初,Called 会对所有 Initializers 做同样的事情,但由于业务需求的变化,它现在需要做不同的事情。
  • 您的要求对我来说没有多大意义。如果您正在重构以添加新功能,为什么要限制您可以更改的内容呢?请edit该问题提供更多有用的上下文,这似乎是一个XY问题。

标签: python python-3.x oop


【解决方案1】:

您可以将初始化它的类作为参数传递给 Called,即:

class class InitializerA:
def calling_function(self):
    Called(self.__name__)


class Called:
def __init__(self, initializer):
     self.initializer = initializer

【讨论】:

  • 很遗憾,这是一些需要修改的遗留代码,我无法向初始化程序添加新参数。
【解决方案2】:

我能够通过修改此问题中给出的方法找到答案: How to get the caller class name inside a function of another class in python?

inspect 库帮助我检查调用堆栈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多