【问题标题】:Python Class: avoid using "self" parameter multiple times in functionPython 类:避免在函数中多次使用“self”参数
【发布时间】:2020-10-19 15:42:47
【问题描述】:

我创建了以下类来在 python 中生成素数:

class primeGen:
    def __init__(self, maxNum):
        self.allNum = [0]*(maxNum+1)
        self.allNum[0], self.allNum[1] = 1, 1
        self.primeNum = []
        for i in range(2, int(math.sqrt(maxNum))+1):
            if self.allNum[i] is 0:
                for j in range(i*i, len(self.allNum), i):
                    self.allNum[j] = 1
        for i in range(maxNum):
            if self.allNum[i] is 0:
                self.primeNum.append(i)

    def print(self):
        print(self.primeNum)

有没有办法避免在函数中多次使用 self 参数?比如,不是每次都使用 self.primeNum ,我可以只使用 primeNum 吗?

【问题讨论】:

  • 能不能用临时局部变量,最后赋值给类变量?
  • 有时可以尝试一下——如果你失败了也没什么大不了的——所以继续删除 self.从 self.allNum 看看你自己会发生什么 - 放心,你的电脑不会爆炸......
  • Python 怎么会理解你指的是instance variable
  • 无论如何你必须重写你的课程。打印功能有什么用?如果您只是创建一个generator 而不是打印素数列表,那会好得多。看看:docs.python.org/3/howto/functional.html#generators
  • 最好补充一下,您使用的是 Eratosthenes 的筛子。还要调用值 TrueFalse 而不是 1 和 0 - 以提高可读性。

标签: python class self


【解决方案1】:

在 Python 中,self 用于引用当前实例。除非您需要将这些值保留为 primeGen 实例的属性,否则您可以删除它们。你可以阅读更多关于它的信息here

例子:

class primeGen:
    def __init__(self, maxNum):
        allNum = [0]*(maxNum+1)
        allNum[0], allNum[1] = 1, 1
        self.primeNum = []
        for i in range(2, int(math.sqrt(maxNum))+1):
            if allNum[i] is 0:
                for j in range(i*i, len(allNum), i):
                    allNum[j] = 1
        for i in range(maxNum):
            if allNum[i] is 0:
                self.primeNum.append(i)

    def print(self):
        print(self.primeNum)

编辑:正如@wwii 在他们的回答中正确指出的那样,也许你根本不需要上课。

【讨论】:

  • 而“self”的具体选择也只是一个约定。它不是语言关键字,尽管这是一些混乱的地方。例如,如果您将方法的第一个参数命名为“me”,那么该方法将通过该变量访问调用它的实例。
【解决方案2】:

有没有办法避免在函数中多次使用self参数

不要使用类,而是从函数中获取功能。

import math
def primeGen(maxNum):
    allNum = [0]*(maxNum+1)
    allNum[0], allNum[1] = 1, 1
    primeNum = []
    for i in range(2, int(math.sqrt(maxNum))+1):
        if allNum[i] is 0:
            for j in range(i*i, len(allNum), i):
                allNum[j] = 1
    for i in range(maxNum):
        if allNum[i] is 0:
            primeNum.append(i)
    return primeNum

q20 = primeGen(20)
print(q20)       
q5 = primeGen(5)
print(q5)       

【讨论】:

    【解决方案3】:

    在您的情况下,您只能创建 self.primeNum。这是 cass 的其他函数成员使用的唯一变量。

    你真的需要所有其他变量作为类的字段吗?它们看起来像临时变量。您无需将它们添加到类中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多