【问题标题】:Get name of class another class is instantiated inside of in Python获取另一个类在 Python 中实例化的类的名称
【发布时间】:2020-01-26 02:24:12
【问题描述】:

是否可以在第一个类中实例化的另一个类中获取python类的名称。

让我举个例子。

class SubClass:
    top_level_name = None # name class it is instantiated in e.g. TopLevelClass

class TopLevelClass:
    subclass = SubClass()

我知道我可以写以下...

class SubClass:
    def __init__(self, class_name):
        self.top_level_name = class_name

class TopLevelClass:
    subclass = SubClass(class_name)

    def __init__(self):
        self.class_name = self.__class__.__name__

但是,在初始化类时不需要将类名作为参数传递,这样做会很好。

这可能吗,只是一厢情愿,或者出于某种我还没有想到的原因,这是一个非常糟糕的主意。

【问题讨论】:

  • 据我了解,您想知道在哪个类中创建了类实例?
  • @Take_Care_ 是的。这就是我想做的。
  • 所以我能想到两种方法:第一种 -> docs.python.org/3/reference/datamodel.html#object.__set_name__
  • Second -> 元类,因为类本身只是某个元类的一个实例,元类可以像你需要的那样实现特殊的初始化。
  • "但是,在初始化类时不需要将类名作为参数传递,这样做会很好。"但这将是最直接和最明确的方法。你可以做你提议的事,但它可能会涉及自省调用堆栈和所有其他类型的元编程,这将完全过度设计某些东西而没有明显的收益(实际上,它会更糟糕 从我的角度来看,非惯用和非明确的“魔法”)。也可能很难创建一个强大的解决方案。

标签: python python-3.x class oop


【解决方案1】:

我建议重新审视这两个类的设计。让实例化类知道调用类违反了封装和抽象的设计原则。它还创建了一个循环依赖(在这种情况下,只有一个逻辑依赖,因为只有类的名称是已知的)。如果您使用类名作为实例化类的某种标识符,您可以在构造函数中传入一个 id 字符串,就像在示例中一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2023-03-28
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多