模拟python类属性的类指针行为

模拟python类属性的类指针行为,python,class,pointers,Python,Class,Pointers,我正在尝试为python3类属性模拟类似指针的行为。 在下面的示例中,我希望obj.b指向obj.a,这样,如果obj.a值在运行时更改,obj.b值将更改为 # not working as expected class A: def __init__(self, value): self.a = value self.b = getattr(self, 'a') obj = A('banana') # now chang

我正在尝试为python3类属性模拟类似指针的行为。 在下面的示例中,我希望obj.b指向obj.a,这样,如果obj.a值在运行时更改,obj.b值将更改为

   # not working as expected
   class A:
      def __init__(self, value):
         self.a = value
         self.b = getattr(self, 'a')
   obj = A('banana')
   # now changing my mind
   obj.a = 'apple'
   # I would like to have obj.b == 'apple', not 'banana' 
我想我正在尝试一个应该更好地避免的肮脏伎俩,但对于我的特定任务来说,这将非常有用

您可以将obj.b设置为一个属性:

class A:
    def __init__(self, value):
        self.a = value

    @property
    def b(self):
        return self.a

    obj = A('banana')
    # now changing my mind
    obj.a = 'apple'
    print(obj.b) # apple
当然,还有比这更重要的一点。例如,如果您尝试执行以下操作:

obj.b = 'orange'
它将失败,因为您无法设置该属性。但是这个

obj.a = 'orange'
将始终有效,并且此测试将始终正确:

控制台中的一个工作示例:

>>> class A:
...     def __init__(self, value):
...             self.a = value
...     @property
...     def b(self):
...             return self.a
...
>>> a = A('apple')
>>> a.a
'apple'
>>> a.b
'apple'
>>> a.a = 'orange'
>>> a.b
'orange'
>>> a.b = 'hello'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
您可以将obj.b设置为属性:

class A:
    def __init__(self, value):
        self.a = value

    @property
    def b(self):
        return self.a

    obj = A('banana')
    # now changing my mind
    obj.a = 'apple'
    print(obj.b) # apple
当然,还有比这更重要的一点。例如,如果您尝试执行以下操作:

obj.b = 'orange'
它将失败,因为您无法设置该属性。但是这个

obj.a = 'orange'
将始终有效,并且此测试将始终正确:

控制台中的一个工作示例:

>>> class A:
...     def __init__(self, value):
...             self.a = value
...     @property
...     def b(self):
...             return self.a
...
>>> a = A('apple')
>>> a.a
'apple'
>>> a.b
'apple'
>>> a.a = 'orange'
>>> a.b
'orange'
>>> a.b = 'hello'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

你可能只需要b是一个返回self.a的属性。但我真的不明白你到底想在这里做什么。为什么你不能使用obj.a本身呢?用例是什么?简而言之,我正在合并几个具有不同变量名定义的方法,尽管它们实际上是相同的东西。如果只有一个驱动变量,它将为所有不同的实例设置值,而不是重新描述所有的方法,这将是很有帮助的。我不习惯装饰,你怎么分配b作为一个属性?你可能只需要b作为一个返回self.a的属性。但我真的不明白你到底想在这里做什么。为什么你不能使用obj.a本身呢?用例是什么?简而言之,我正在合并几个具有不同变量名定义的方法,尽管它们实际上是相同的东西。如果只有一个驱动变量,它将为所有不同的实例设置值,而不是重新描述所有的方法,这将是很有帮助的。我不习惯装饰,你怎么分配b为合适的?嗯,很有趣。谢谢。出于好奇,有没有可能有一种对称的行为,如果b被改变,a也会实现?@Aderam是的,你可以,你也可以为b创建一个setter。我建议你读一读关于财产的书,它在很多情况下都很有用。嗯,很有趣。谢谢。出于好奇,有没有可能有一种对称的行为,如果b被改变,a也会实现?@Aderam是的,你可以,你也可以为b创建一个setter。我建议你读一下财产,它在很多情况下都很有用