【问题标题】:simulating pointer like behavior for python class attribute模拟python类属性的指针行为
【发布时间】:2020-03-18 06:51:10
【问题描述】:

我正在尝试为 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' 

我想我正在尝试做一个应该更好地避免的肮脏把戏,但对于我的具体任务来说它会很有帮助

【问题讨论】:

  • 您可能只需要 b 作为返回 self.a 的属性。但我无法真正理解您在这里实际想要做什么。
  • 为什么不能使用obj.a 本身?用例是什么?
  • 简而言之,我正在合并几种具有不同变量名称定义的方法,尽管它们实际上是相同的东西。只有一个“驱动”变量会为所有不同的实例设置值,而不是重新编写所有方法,这将很有帮助。我不习惯装饰器,您如何将 b 分配为属性?

标签: python class pointers


【解决方案1】:

您可以将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'

总是有效,而且这个测试总是True

obj.a == obj.b

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

>>> 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 改变 a 也可以实现?
  • @Aderam 是的,您可以,您也可以为b 创建一个setter。我建议你阅读property,它在很多情况下都非常有用
猜你喜欢
  • 2018-09-21
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多