【问题标题】:"self" in a class method [duplicate]类方法中的“self”[重复]
【发布时间】:2021-04-03 01:21:10
【问题描述】:

我在创建字典的类中定义一个方法。这本字典只是给字母表中的每个字母一个值。所以该方法不会操纵该类的任何实例。在这种情况下,我是否需要将self 作为方法的参数?

def build_shift_dict(self, shift):
    import string
    low = string.ascii_lowercase*2
    up = string.ascii_uppercase*2
    punc = list(" !@#$%^&*()-_+={}[]|\:;'<>?,./\"")
    shift_dict = {}

    for i in low[:26]:
        shift_dict[i] = low[low.index(i) + shift]

    for i in up[:26]:
        shift_dict[i] = up[up.index(i) + shift]

    for i in punc:
        shift_dict[i] = i

    return shift_dict

【问题讨论】:

  • 是的,如果是实例方法,则需要self 参数,因为python会将其传入。是否应该是实例方法是另一个问题。
  • 我会留给其他人来决定,但我认为 stackoverflow.com/questions/7554738/python-self-no-self-and-clsstackoverflow.com/questions/37963018/… 可能是重复的
  • 仍然不完全清楚为什么在不使用类实例的方法中需要“self”,但我想我需要将其视为给定并应用 @staticmethod 代替
  • @Mikki 因为实例将自动分配给函数的第一个参数。如果您省略self 并写def build_shift_dict(shift):,那么您将不会有班次,但实例将被称为shiftself 这个词没有任何神奇的属性——重要的只是参数的数量。

标签: python class methods self


【解决方案1】:

不,你可以把它设为static method

@staticmethod
def build_shift_dict(shift):
    ... do the things

【讨论】:

    【解决方案2】:

    如果你想拥有一个既不属于类的实例也不属于类的函数,你可以使用@staticmethod 装饰器到函数中,注意你需要删除self 因此:

    @staticmethod
    def build_shift_dict(shift):
        import string
        low = string.ascii_lowercase*2
        up = string.ascii_uppercase*2
        punc = list(" !@#$%^&*()-_+={}[]|\:;'<>?,./\"")
        shift_dict = {}
        
        for i in low[:26]:   
                shift_dict[i] = low[low.index(i) + shift]
                
        for i in up[:26]:   
                shift_dict[i] = up[up.index(i) + shift]
                
        for i in punc:   
                shift_dict[i] = i
        
        return shift_dict     
    

    文档

    其他堆栈溢出答案

    观察

    对于某些人来说,对于用户静态方法(或至少不是所有时间)来说,这被认为是一个很好的编程设计,并且通常更好地查看要在类之外声明的函数,而不是在类中使用它,然后将其包装在静态方法中,但实际上取决于。

    另外,声明一个静态方法或创建一个函数在一个类之外基本上是一样的,因此更多的是一个设计选择而不是功能选择,并且取决于设计师/开发人员来选择哪个是最好的。

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多