什么时候不应该在 Python 中使用 self 约定?

Jam*_*mes 2 python convention styles memory-management self

我最近刚刚了解了selfPython 中的约定,并开始编写更复杂的代码。然而,一位经验丰富的程序员和我的朋友告诉我,self在类方法中使用每个变量是浪费的。

我知道这self会导致变量归属于该类。那么,除非有需要,避免使用是不是一种好的做法self

下面是一些从 API 获取英雄联盟信息并将每个变量存储在其中的代码,self.var_name以说明我如何(也许不必要)使用self.

async def getChampInfo(self, *args):
    """ Return play, ban, and win rate for a champ """
    self.uri = "http://api.champion.gg/v2/champions/{}?api_key={}"
    self.champ = " ".join(args)
    self.champID = lu.getChampID(self.champ)
    self.res = requests.get(self.uri.format(
        self.champID, League.champion_gg_api_key)).json()
    self.role = self.res[0]["role"]
    self.role_rate = self.res[0]["percentRolePlayed"]
    self.play_rate = self.res[0]["playRate"]
    self.win_rate = self.res[0]["winRate"]
    self.ban_rate = self.res[0]["banRate"]
Run Code Online (Sandbox Code Playgroud)

jmu*_*sch 5

有些情况下self不需要使用。

我的头顶上浮现出:

  • 当变量仅在 1 个函数中使用,或者在函数/方法内部创建并且仅在该函数/方法中使用时
  • 当变量不需要在方法之间共享时
  • 当变量不需要暴露给其他类/范围/上下文时

另一个部分答案是,在创建元类/工厂/组合时,像这样的东西可能更有意义,远离使用self类似的约定:

class Factory(object):
    def __init__(cls, *args, **kwargs):
        thing = cls(args, kwargs)
Run Code Online (Sandbox Code Playgroud)

我可能会遗漏一些东西,但这些是我目前能想到的。

有关的: