Python 如何找到房产的所有者?

Python 如何找到房产的所有者?,python,class,oop,super,Python,Class,Oop,Super,我有一个简单的类叫做 class A(object): pass 我在变量“A”中创建了一个类A的实例 然后我创建了一个名为“b”的a属性,它是类a的另一个实例 a.b = A() 如果我像这样失去了对“a”的引用 有没有办法在c上调用某种函数/方法来返回“a” 我想我必须使用super()函数,但我不知道 我的方法 我想了很多,这就是我决定做这件事的原因 class notObject(object): pass class A(notObject): def _

我有一个简单的类叫做

class A(object):
    pass
我在变量“A”中创建了一个类A的实例

然后我创建了一个名为“b”的a属性,它是类a的另一个实例

a.b = A()
如果我像这样失去了对“a”的引用

有没有办法在c上调用某种函数/方法来返回“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”,但如果继承自对象,则无法将属性设置为其super。

我知道3种处理方法。根据我推荐的数量,它们是:

  • 不要这样做。如果需要
    a
    ,请跟踪
    a
    ,而不仅仅是它的
    b
    属性
  • a.b
    一个引用
    a
    的属性。类似于
    a.b.owner=a
    ,尽管您希望这样做不会让对象变得一团糟,有时有属性,有时没有属性
  • 搜索
    gc。获取
    A
    实例的\u referers(c)
    ,该实例的
    b
    属性为
    c
    。这很容易出错,因为其他一些
    实例也可能具有相同的属性

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

    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的内置结构不强制要求对象“由一个对象拥有”或“通过一个对象引用”。任何对象都可以被任意数量的其他对象引用。如果你想让一个对象有一个“所有者”的概念,你需要自己定义这个概念并将它构建到对象中(例如,给它一个“所有者”属性,当你决定所有权发生变化时,你自己更新它)。

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

    你问如何找到一处房产的主人。。。。但没有一个“所有者”。。。就其本身而言。。。只有对该对象的引用。任何给定对象都可能有多个引用。以以下为例:

    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。据我所知,没有办法找出哪些对象引用了给定的对象,除非你能扫描你知道的每一个变量,并测试给定的属性是否就是你正在检查的对象


    简短的回答。不要丢失推荐信。如果它们很重要。。。留着吧。如果一个对象需要另一个对象,您应该构造您的类,以便在对象创建时注入依赖项,并且该对象跟踪它自己的依赖项。查看以了解有关此设计模式的更多信息。

    您确定将
    b
    作为一个属性,而不仅仅是一个属性吗?我确信您可以通过反射(
    inspect
    等)来实现这一点,但我无法想象在任何情况下,这在生产代码中都是一个好主意。
    a = A()
    a.b = A()
    c = a.b
    del a.b
    
    a1 = A()
    a2 = A()
    c = A()
    a1.b = c
    a2.b = c
    
    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