模拟python类属性的类指针行为
我正在尝试为python3类属性模拟类似指针的行为。 在下面的示例中,我希望obj.b指向obj.a,这样,如果obj.a值在运行时更改,obj.b值将更改为模拟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
# 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。我建议你读一下财产,它在很多情况下都很有用