Как я могу создать псевдоним для атрибута, не являющегося функциональным членом класса Python?

Я нахожусь в процессе написания API библиотеки Python, и я часто сталкиваюсь со сценарием, когда моим пользователям требуется несколько разных имен для одних и тех же функций и переменных.

Если у меня есть класс Python с функцией foo () , и я хочу создать для него псевдоним bar () , это очень просто:

class Dummy(object):

   def __init__(self):
      pass

   def foo(self):
      pass

   bar = foo

Теперь я могу сделать это без проблем:

d = Dummy()
d.foo()
d.bar()

Мне интересно, как лучше всего сделать это с помощью атрибута класса, который является обычной переменной (например, строкой), а не функцией? Если бы у меня был этот фрагмент кода:

d = Dummy()
print d.x
print d.xValue

Я хочу, чтобы dx и d.xValue в ВСЕГДА печатали одно и то же. Если dx изменится, он также должен изменить d.xValue (и наоборот).

Я могу придумать несколько способов сделать это, но ни один из них не кажется сколь угодно гладко:

  • Напишите пользовательскую аннотацию
  • Используйте аннотацию @property и возитесь с сеттером
  • Замените функции класса __ setattr __

Какой из этих способов лучше? Или есть другой способ? Я не могу не чувствовать, что, если так легко создавать псевдонимы для функций, это должно быть так же легко и для произвольных переменных ...

К вашему сведению: я использую Python 2.7.x, а не Python 3.0, поэтому я требуется решение, совместимое с Python 2.7.x (хотя мне было бы интересно, сделает ли Python 3.0 что-нибудь для непосредственного удовлетворения этой потребности).

Спасибо!

18
задан Brent Writes Code 25 October 2010 в 18:19
поделиться