13

通常の方法:

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

    def another_method(self):
        self.a.b.c = self.a.b.c * 10

エイリアスアプローチ:

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

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

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

4

2 に答える 2

27

これに対する解決策は、getter メソッドと setter メソッドを使用することです。幸いなことに、Python にはこのproperty()さを隠すためのビルトインがあります。

class A:
    def __init__(self):
        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 another_method(self):
        self.aliased *= 10  # Updates value of self.a.b.c

一般に、 のように深くネストされた属性self.a.b.cは、悪い設計の兆候です。一般に、3 つの関係にあるオブジェクトをクラスに認識させる必要はありません。これは、特定の項目への変更がコード ベース全体で問題を引き起こす可能性があることを意味します。各クラスがその周りのクラスを処理できるようにすることをお勧めします。

于 2012-06-15T11:58:28.967 に答える
6

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']

于 2012-06-15T11:39:27.077 に答える