如何找到房产的主人?

2024-09-30 01:19:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的类叫做a

class A(object):
    pass

我在变量“A”中创建了一个类的实例

^{pr2}$

然后我创建了一个名为“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”,但是如果一个继承自对象,我就不能将属性设置为它的超级。在


Tags: 实例方法函数nameself属性objectvalue
3条回答

如果你失去了对某个对象的引用,除了。。。另一个参考。(反正我也不知道)。如果你需要参考资料。。。留着吧

你问如何找到房产的主人。。。。但是没有一个“主人”。。。本身。。。只有对那个对象的引用。任何给定的对象都可能有多个引用。以下面的例子为例:

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以了解有关此设计模式的更多信息。在

一般来说你不能,因为可能没有一个,或者可能不止一个。例如,如果你这样做了:

a = A()
a.b = A()
c = a.b
del a.b

通过删除属性a.b,可以删除a与以前称为a.b的对象之间的链接。对象仍然存在,但它不再与a有任何关系。在

同样,您可以这样做:

^{pr2}$

现在c的“所有者”是什么?同一对象是a1和{}属性的值。在他们之间没有选择的余地。在

在Python中没有内置的“所有权”概念,因为Python的内置结构不强制要求对象“属于”或“通过”一个对象“引用”。任何数量的其他对象都可以引用。如果你想让一个对象有一个“所有者”的概念,你需要自己定义这个概念并将它构建到对象中(例如,通过给它一个“所有者”属性,当你决定所有权发生变化时,你自己更新它)。在

我知道有三种方法可以解决这个问题。按照我的推荐程度,它们是:

  1. 别这么做。如果需要a,请跟踪a,而不仅仅是它的b属性。在
  2. a.b一个引用a的属性。类似于a.b.owner = a的东西,尽管您希望这样做时不要把对象弄得一团糟,有时有属性,有时没有属性。在
  3. gc.get_referrers(c)中搜索A实例,该实例的b属性是c。这很容易出错,因为其他一些A实例也可能具有相同的属性。在

相关问题 更多 >

    热门问题