2012-08-13 44 views
0

我正在學習Python的OOP並試圖將一個Java類轉換爲Python類蟒蛇太多的自我在

看到這個PDF的Java代碼谷歌文檔link

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) 

有15頁在這個類中有16個self關鍵字。有沒有更好的方式來寫這個類?

+2

'self.id = [];對於範圍(n)中的e:self.id.append(e)'與'self.id = list(range(n))'完全相同。另外,確保你的類繼承自'object()'=) – katrielalex 2012-08-13 23:31:46

回答

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,而不是方法內的任何變量。

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__的調用),但不應損害可讀性。