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