如何从属性内部获取类名(这又是某种类型的对象)

Posted

技术标签:

【中文标题】如何从属性内部获取类名(这又是某种类型的对象)【英文标题】:How to get class name from inside an attribute(which is in turn an object of some type) 【发布时间】:2019-12-04 22:00:02 【问题描述】:

我有一个在多个其他类中聚合的类,当我到达这个类的一个实例时,我想知道它属于哪个类,以便访问正确的 do_stuff 函数(我在想一些像Bar.do_stuff()一样打电话)。在下面的示例中,我试图简化它。如果有一种方法可以避免获取聚合器类名并在这种情况下仍然使用它的功能,那很好。我喜欢super() 之类的东西,它可以为我提供属性所属类的cls.__name__()

一些简单的例子:

class Foo:
    def __init__(self, val):
        self._val = val

    def which_class_am_i_part_of(self):
        cls = None  # How to get the class?
        print("I am an attribute of the class ".format(cls))


class Bar:
    def __init__(self):
        self.foo = Foo(10)
    def do_stuff(self):
        pass



class Qux:
    def __init__(self):
        self.foo = Foo(20)
    def do_stuff(self):
        pass


qux = Qux()
bar = Bar()
foo = qux.foo
foo.which_class_am_i_part_of()  # I am an attribute of the class Qux
foo = bar.foo
foo.which_class_am_i_part_of()  # I am an attribute of the class Bar

我希望它打印这个: 我是 Qux 类的一个属性 我是类 Bar 的一个属性 而且我希望它能够很好地扩展,例如,如果我将 Foo 包含在 100 个以上不同的类中,我希望能够获得它所属的类,无论它属于哪个类(假设我有一个对 Foo 对象的引用)

【问题讨论】:

这不是属性跟踪的东西。存储在qux.__dict__ 中的对foo 的引用只是对foo许多 个可能引用之一。如果qux.foo is bar.foo 为真,您希望which_class_am_i_part_of 返回什么? 部分问题在于名称和名称所指的对象之间的区别。 fooqux.foo 都是在foo = qux.foo 之后引用同一个对象的名称(好的,第二个是一个表达式,但对于我们的目的而言,它与名称非常接近)。 qux.foo 可以被认为是一个属性名称(因为 qux.__dict__ 包含一个键 foo),但这与您的分配创建的另一个变量 foo相同。 换一种说法,foo = qux.foo 不存储有关哪个表达式用于初始化 foo 的任何信息。 【参考方案1】:

您无法自动执行此操作。唯一的方法是在实例化时显式传递所有者。

class Foo:
    def __init__(self, val, cls):
        self._val = val
        self.cls = cls

    def which_class_am_i_part_of(self):
        print("I am an attribute of the class ".format(self.cls))


class Bar:
    def __init__(self):
        self.foo = Foo(10, self)

【讨论】:

以上是关于如何从属性内部获取类名(这又是某种类型的对象)的主要内容,如果未能解决你的问题,请参考以下文章

Class 反射获得构造,方法,属性,内部类等

java中关于内部类和匿名内部类

内部类

类名.this与this的区别

内部类

Java_内部类