在Python中有没有一种方法可以将引用分配给对象属性?

2024-10-17 06:24:07 发布

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

我想将一个对象的属性永久链接到另一个对象的属性,这样每当后者发生更改时,前者都会自动更新。在

我尝试过使用=来使用简单赋值,但这只在赋值时赋值,而我想给属性本身赋值。在

class firstObj:

    def __init__(self,n):
        self.name=n
        self.inA=1

    @property
    def outA(self):
        return self.inA+2

class secondObj:

    def __init__(self,n):
        self.name=n
        self.inA=1

    @property
    def outA(self):
        return self.inA*2




fo=firstObj("FO")
so=secondObj("SO")
fo.inA=so.outA

我试图将so的输出链接到fo的输入

在所以,inA=2
-->;所以,奥塔变成4
-->;福伊纳变成4
-->;外景地变成6

(更普遍地说,在python中,是否有一种方法可以将对变量的引用分配给另一个变量,而不是将变量的值赋给另一个变量,这样a=b就不会将b的值赋给a,而是将b的值赋给b本身)


Tags: 对象namegtself属性soinit链接
3条回答

python中的变量只是一个字典映射var name=value,如果您尝试print(globals())它将为所有模块变量打印一个字典映射

如果您需要实现您想要的,可以在类定义中执行以下操作:

class firstObj:
    def __init__(self,n, obj=None):
        self.name=n
        self._inA=1 
        self.obj = obj

    @property
    def inA(self):
        if self.obj is not None:
            self._inA = self.obj.outA
        return self._inA

    @property
    def outA(self):
        return self.inA+2 


class secondObj:
    def __init__(self,n):
        self.name=n
        self.inA=1

    @property
    def outA(self):
        return self.inA*2


so=secondObj("SO")
fo=firstObj("FO", so)
# fo.inA=so.outA

so.inA=2
print(so.outA) # becomes 4
print(fo.inA) # becomes 4
print(fo.outA) # becomes 6

输出:

^{pr2}$

在原生Python中,没有直接的支持。但是,您可以使用回调来模拟此功能:

from functools import partial

class Teller:

    def __init__(self, name):
        super().__setattr__('_callbacks', {})
        self.name = name

    def register(self, attr, callback):
        if attr in self._callbacks:
             self._callbacks[attr].append(callback)

        else:
            self._callbacks[attr] = [callback]

    def __setattr__(self, attr, value):
        if attr in self._callbacks:
            for callback in self._callbacks[attr]:
                callback(value)

        else:
            self._callbacks[attr] = []

        super().__setattr__(attr, value)

class Asker:

    def __init__(self, name):
        self.name = name

    def bind(self, self_attr, other, other_attr):
        other.register(other_attr, partial(setattr, self, self_attr))
        setattr(self, self_attr, getattr(other, other_attr))

teller = Teller('Teller')
teller.teller_value = 5
asker = Asker('Asker')
asker.bind('asker_value', teller, 'teller_value')

print(f'teller_value is now {teller.teller_value}')
print(f'asker_value is now {asker.asker_value}')

teller.teller_value = 10

print(f'teller_value is now {teller.teller_value}')
print(f'asker_value is now {asker.asker_value}')

输出:

^{pr2}$

基本上,这需要Asker的实例将其属性之一绑定到Teller的一个实例;然后,每当Teller实例修改该属性时,Asker实例的相应属性也将更改。在

你不能这样做。Python无法让一个名称引用另一个名称,这正是您想要的(您想要的)福伊纳指所以,奥塔). 名称只能引用值。这个演讲有更多细节:Python Names and Values。在

相关问题 更多 >