Python 类方法中的“self”

Python 类方法中的“self”,python,class,methods,self,Python,Class,Methods,Self,我在创建字典的类中定义一个方法。这本字典只是给字母表中的每个字母一个值。因此,该方法不会操作该类的任何实例。在这种情况下,是否需要将self作为方法的参数 def build_shift_dict(self, shift): import string low = string.ascii_lowercase*2 up = string.ascii_uppercase*2 punc = list(" !@#$%^&*()-_+={}[]|\:;'

我在创建字典的类中定义一个方法。这本字典只是给字母表中的每个字母一个值。因此,该方法不会操作该类的任何实例。在这种情况下,是否需要将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

不,你可以做一个


不,你可以做一个


如果您想拥有一个不属于类实例或类的函数,您可以使用@staticmethod decorator对该函数进行修饰,请注意,您需要删除self,因此:

文档 其他堆栈溢出答案 观察 对于一些人来说,被认为是对用户staticmethods的良好编程设计,或者至少不是一直都是这样,通常最好在类外查看要声明的函数,而不是在类内使用它,然后将其包装到staticmethod中,但这确实取决于


另外,在类之外声明staticmethod或生成函数基本上是一样的,因此,与其说是功能选择,不如说是设计选择,这取决于设计师/开发人员选择哪一个是最好的。

如果您想要一个不属于类实例或类的函数,您可以使用@staticmethod decorator对该函数进行修饰,请注意,您需要删除self,因此:

文档 其他堆栈溢出答案 观察 对于一些人来说,被认为是对用户staticmethods的良好编程设计,或者至少不是一直都是这样,通常最好在类外查看要声明的函数,而不是在类内使用它,然后将其包装到staticmethod中,但这确实取决于


另外,在类之外声明staticmethod或生成函数基本上是一样的,因此更多的是设计选择,而不是功能选择,这取决于设计师/开发人员选择哪一个是最好的。

是的,如果是实例方法,您需要self参数,因为python会传入它。是否应该是实例方法是另一个问题。我会让其他人来决定,但我认为可能是重复的,直到不完全清楚为什么在不使用类实例的方法中需要self,但我想我需要把它当作一个给定的方法来应用@staticmethodinstead@Mikki因为实例将自动分配给函数的第一个参数。如果您省略self并编写def build_shift_dictshift:那么您将不会得到一个shift,但该实例将被称为shift。self这个词没有任何神奇的属性——重要的只是参数的数量。是的,如果它是一个实例方法,您需要self参数,因为python将传递它。是否应该是实例方法是另一个问题。我会让其他人来决定,但我认为可能是重复的,直到不完全清楚为什么在不使用类实例的方法中需要self,但我想我需要把它当作一个给定的方法来应用@staticmethodinstead@Mikki因为实例将自动分配给函数的第一个参数。如果您省略self并编写def build_shift_dictshift:那么您将不会得到一个shift,但该实例将被称为shift。self这个词没有任何神奇的特性——重要的只是争论的数量。
@staticmethod
def build_shift_dict(shift):
    ... do the things
@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