Sol*_*une 3 python class object parent
所以,我试图得到一个自定义对象在'内部'的对象.这是一个例子.
假设o是一个对象 - 它不管是什么类型,它只能存储变量.
o = Object()
class Test():
def __init__(self):
self.parent = o ## This is where I fall off; I want to be able to access
## the o object from within the Test object
o.test = Test()
Run Code Online (Sandbox Code Playgroud)
那么,我如何从Test内部获得o?我知道我可以编写Test函数来传递它
o.test = Test(o)
Run Code Online (Sandbox Code Playgroud)
但我宁愿从类定义中做到这一点.
(我知道这是一个老问题,但因为它没有答案......)
你可以尝试搞乱垃圾收集器.打算建议查看模块级别的对象,但是一些快速的代码实验给出了这个:尝试该gc.get_referrers(*objs)
功能.
import gc
class Foo(object):
"""contains Bar"""
def __init__(self, val):
self.val = val
self.bar = None
class Bar(object):
"""wants to find its parents"""
def __init__(self, something):
self.spam = something
def find_parents(self):
return gc.get_referrers(self)
Run Code Online (Sandbox Code Playgroud)
结果并不简单,因此您必须应用自己的逻辑来确定哪个f
是您正在寻找的那个.请注意'f': <__main__.Foo object at ...>
以下内容:
>>> f = Foo(4)
>>> b = Bar('ham')
>>> f.bar = b
>>> b.find_parents()
[{'bar': <__main__.Bar object at 0x7f3ec5540f90>, 'val': 4}, <frame object at 0x238c200>,
{'b': <__main__.Bar object at 0x7f3ec5540f90>,
'Bar': <class '__main__.Bar'>,
'f': <__main__.Foo object at 0x7f3ec5540f10>, # <-- these might be
# the droids you're looking for
'__builtins__': <module '__builtin__' (built-in)>,
'__package__': None, 'gc': <module 'gc' (built-in)>, '__name__': '__main__',
'Foo': <class '__main__.Foo'>, '__doc__': None
}]
Run Code Online (Sandbox Code Playgroud)
对于奖励积分,请使用gc.get_referents(*objs)
这些积分来检查b
列表中是否有相同的积分.
一些注意事项/警告:
init
其他方法.这就是我要做的,而不是我上面的建议.你可以这样做:
class Object:
def __setattr__(self, name, value):
if isinstance(value, Test):
value.set_parent(self)
self.__dict__[name] = value
class Test:
def set_parent(self, parent):
self.parent = parent
o = Object()
o.test = Test()
assert o.test.parent is o
Run Code Online (Sandbox Code Playgroud)
你说的是继承吗?不太清楚你的意思,但如果你只想这样做:
class Test():
def __init__(self,o):
self.parent = o
def other_method(self):
do_something_with(self.parent)
Run Code Online (Sandbox Code Playgroud)
它工作完美。
**ed:如果您想这样做,这根本不是您应该如何进行继承的方式。但是,根据您描述问题的方式,我认为您想要创建对象的树状结构,而不是让类相互继承属性。