3

私はPython OOPを学んでおり、JavaクラスをPythonクラスに変換しようとしています

Java コードの google docリンクについては、この PDF の 15 ページを参照してください。

class QuickFindUF:
        """docstring for QuickFindUF"""


    def __init__(self, n):
            self.id = []
            for e in range(n):
                    self.id.append(e)


    def connected(self,p,q):
            return self.id[p]==self.id[q]

    def union(self,p,q):
            self.pid = self.id[p]
            self.qid = self.id[q]
            for i in range(len(self.id)):
                    if(self.id[i]==self.pid):
                            self.id[i]=self.qid


quf = QuickFindUF(9)
quf.union(3,4)
print quf.connected(3,4)

このクラスには 16 個selfのキーワードがあります。このクラスを記述するより良い方法はありますか?

4

3 に答える 3

7

はい、これらの変数を に割り当てたくありませんself。これらはローカル変数です。

def union(self,p,q):
        self.pid = self.id[p]
        self.qid = self.id[q]
        for i in range(len(self.id)):
                if(self.id[i]==self.pid):
                        self.id[i]=self.qid

次のようにする必要があります。

def union(self,p,q):
    pid = self.id[p]
    qid = self.id[q]
    for i in range(len(self.id)):
        if self.id[i] == pid:
            self.id[i] = qid

selfメソッド内の変数ではなく、インスタンス変数を参照する場合にのみ使用します。

于 2012-08-13T23:26:12.470 に答える
1

いくつかのショートカットを使用できます。

class QuickFindUF:
    """docstring for QuickFindUF"""

    def __init__(self, n):
        self.id = range(n)

    def connected(self,p,q):
        _id = self.id
        return _id[p]==_id[q]

    def union(self,p,q):
        _id = self.id
        pid = _id[p]
        qid = _id[q]
        for (k, _i) in enumerate(_id):
           if (_i == pid):
               _id[k]=qid

__init__@katrielalexによって示されているように、の簡略化と、enumerateでループする代わりにの使用に注意してくださいrange(len(self.id))

ショートカットを使用すると(への呼び出しを保存するため)少し効率的になりますが、__getattr__読みやすさを損なうことはありません。

于 2012-08-13T23:52:48.517 に答える