python类中的self太多了

2024-09-30 00:31:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习Python-OOP并尝试将Java类转换为Python类

关于Java代码,请参阅本PDF第15页google doclink

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关键字。有没有更好的方法来写这门课?在


Tags: 代码inselfidfordefrangejava
2条回答

是的,您不想将这些变量赋给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

应该是:

^{pr2}$

当引用实例变量时,只使用self,而不是方法中的任何变量。在

您可以使用一些快捷方式:

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__中的简化,如@katrielex所指出的,以及使用enumerate而不是在range(len(self.id))上循环。在

使用快捷方式可能更有效(因为您保存了对__getattr__的调用),但不应损害可读性。在

相关问题 更多 >

    热门问题