web-dev-qa-db-ja.com

Pythonで変数のエイリアスを作成するにはどうすればよいですか?

通常の方法

class A:
    __init__():
     self.a.b.c = 10

    anotherMethod():
      self.a.b.c = self.a.b.c * 10

エイリアスアプローチ

class A:
    __init__():
     self.a.b.c = 10         
     alias self.aliased = self.a.b.c # Creates an alias 

    anotherMethod():
      self.aliased = self.aliased * 10 # Updates value of self.a.b.c

Pythonでエイリアシングをどのように達成しますか?私がやりたい理由は、長い変数名による混乱を減らすためです。 マルチスレッド環境です。したがって、ローカル変数にコピーするだけでは機能しません。

9
AIB

これに対する解決策は、getterメソッドとsetterメソッドを使用することです-幸いなことにPythonには property()組み込み があり、これの醜さを隠します。

class A:
    def __init__():
     self.a.b.c = 10

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

    @aliased.setter
    def aliased(self, value):
         self.a.b.c = value

    def anotherMethod():
      self.aliased *= 10 # Updates value of self.a.b.c

他の人が指摘しているように、一般的にこれは悪い設計の兆候です-通常、クラスが3つの関係から離れているオブジェクトについて知る必要はありません-これは、特定のアイテムへの変更がコードベース全体で問題を引き起こす可能性があることを意味します。各クラスが周囲のクラスを処理するようにして、それ以上は行わないことをお勧めします。

21
Gareth Latty

あなたは混乱しています。 Pythonは暗黙的に何もコピーせず、参照のみを保存するため、どの環境にいても機能します。

# this creates a list and stores a *reference* to it:
really_really_long_variable_name = [] 
# this creates another new reference to the *same list*. There's no copy.
alias = really_really_long_variable_name

alias.append('AIB')
print really_really_long_variable_name

['AIB']を取得します

9
nosklo