【发布时间】: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返回什么? -
部分问题在于名称和名称所指的对象之间的区别。
foo和qux.foo都是在foo = qux.foo之后引用同一个对象的名称(好的,第二个是一个表达式,但对于我们的目的而言,它与名称非常接近)。qux.foo可以被认为是一个属性名称(因为qux.__dict__包含一个键foo),但这与您的分配创建的另一个变量foo不相同。 -
换一种说法,
foo = qux.foo不存储有关哪个表达式用于初始化foo的任何信息。
标签: python class attributes aggregate aggregation