我有一个名为A
的简单类class A(object):
pass
我在变量“a”
中创建了A类的实例a = A()
然后我创建了一个名为“b”的属性,它是A类的另一个实例
a.b = A()
如果我丢失了对“a”这样的引用
c = a.b
有没有办法在c上调用某种函数/方法来返回“a”
someFunction(c) == a or c.someMethod() == a
我以为我必须使用super()函数,但我不知道。
我的方法
我想到了更多,这就是我决定去做的事情
class notObject(object):
pass
class A(notObject):
def __setattr__(self,name,value):
if isinstance(value,A) and name!="parent":
value.parent = self
super(notObject,self).__setattr__(name, value)
a = A()
a.b = A()
c = a.b
c.parent==a
现在,如果有人可以清理一下这个代码,那将是值得赞赏的。我不想创建一个占位符类“notObject”,但是如果A继承自object,那么我就无法将属性设置为super。
答案 0 :(得分:1)
我知道有3种方法可以解决这个问题。按照我推荐它们的程度,它们是:
a
,请跟踪a
,而不仅仅是b
属性。a.b
提供引用a
的属性。像a.b.owner = a
这样的东西,虽然你想要的方式不会造成一堆乱七八糟的物体,有时候会有属性,有时却没有。gc.get_referrers(c)
搜索A
属性为b
的{{1}}实例。这很容易出错,因为其他一些c
实例也可能具有相同的属性。答案 1 :(得分:1)
一般情况下,因为可能没有,或者可能不止一个。例如,如果你这样做了:
a = A()
a.b = A()
c = a.b
del a.b
删除属性a.b
,即可删除a
与之前称为a.b
的对象之间的链接。该对象仍然存在,但它与a
不再有任何关系。
同样,你可以这样做:
a1 = A()
a2 = A()
c = A()
a1.b = c
a2.b = c
现在"所有者" c
的?同一对象是a1
和a2
属性的值。没有办法在它们之间做出选择。
没有内置概念"所有权"在Python中,因为Python的内置结构不会强制要求对象被"所拥有。或"可引用via"恰好一个对象。任何数量的其他对象都可以引用任何对象。如果你想让一个对象拥有其所有者"的概念,你需要自己定义这个概念并将其构建到对象中(例如,通过给它一个"所有者"属性,当您决定所有权已更改时,您会自行更新。
答案 2 :(得分:0)
如果您丢失了对某个对象的引用,除了...另一个引用之外,无法将其恢复。 (不管怎样我都不知道)。如果你需要参考某些东西......保持它
你问过如何找到一个属性的所有者....但是没有一个“所有者”...本身...只有对该对象的引用。并且可以存在对任何给定对象的多个引用。请看以下示例:
class A(object):
pass
# Create an instance of A
a = A()
# Create a string object
myString = 'Test string'
# Assign the string to a.stringVal
a.stringVal = myString
# Create another instance of A
a2 = A()
# Assign the same string to a2.stringVal
a2.stringVal = myString
在这个例子中...谁“拥有”myString?是a还是a2?答案是每个对象只有一个对同一个对象的引用。参考文献是一条单行道。你可以按照参考,但你不能回到另一个方向。换句话说......如果你只知道myString,你就无法获得a或a2。并且我无法确定哪些对象具有对给定对象的引用,除非您能够以某种方式扫描您知道的每个变量并进行测试以查看给定属性是否是您正在检查的对象。
简短回答。不要丢失参考文献。如果它们很重要......请保留它们。如果一个对象需要另一个对象,你应该构造你的类,以便在创建对象时注入依赖关系,并且该对象会跟踪它自己的依赖关系。查看http://en.wikipedia.org/wiki/Dependency_injection以了解有关此设计模式的更多信息。