【问题标题】:passing list to a function in a class将列表传递给类中的函数
【发布时间】:2020-01-09 16:12:36
【问题描述】:

我正在学习 Python。我不确定如何将列表传递给类中的函数。这是我的例子:

class Solution:

    def fn_one(self, strs = []):
        print(strs[0])
        return strs[0]


strs = ["ab", "abc", "abcs", "abx"]
x = Solution.fn_one(strs) 

输出:

IndexError: 列表索引超出范围

就像我传递一个空列表一样。我做错了什么?

【问题讨论】:

  • 你为什么在这里使用一个类?你的类没有内部状态,这是没有意义的。此外,您不会实例化它的实例,而只是尝试直接调用类上的函数,因此 strs 被传递给 self (因为它实际上只是您定义的函数)。最后,在使用可变对象作为默认值时应该小心,默认值在函数定义时被评估一次。如果您改变该默认值,则在每次使用默认值的调用中都会看到突变...
  • 你应该从Python tutorial开始。

标签: python list function


【解决方案1】:

因为fn_one 是一个实例方法,所以你将strs 作为self 传递,你可以创建一个Solution 的实例,让它作为self 传递,strs 作为strs 列表:

x = Solution().fn_one(strs)

输出:

ab

除非这不是您想要的,您可以使用 @staticmethod 装饰器将 fn_one 定义为静态方法:

class Solution:
    @staticmethod
    def fn_one(strs = []):  #  here, nothing is passed automatically
        print(strs[0])
        return strs[0]

X = Solution.fn_one(strs)
#   Solution().fn_one(strs) would work also, since nothing is passed automatically

或者,作为类方法,使用@classmethod 装饰器:

class Solution:
    @classmethod
    def fn_one(cls, strs = []):  #  here, the class is passed automatically as `cls`
        print(strs[0])
        return strs[0]

X = Solution.fn_one(strs)

但是,如果类或对象都不是该方法正常工作所必需的,那么使用静态方法是最好的方法。如果您的类中没有任何与对象一起使用的方法,则不需要类,只需使用函数即可。

【讨论】:

  • "但是如果类和对象都不是方法正常工作所必需的,那么使用静态方法是最好的方法。"在这种情况下,最好的方法是根本不使用方法......
  • @juanpa.arrivillaga 你说得对,我的意思是方法fn_one,可能还有其他方法没有在代码中显示,适用于实例。
【解决方案2】:

fn_one 方法上方添加@classmethod 装饰器或先实例化该类,如下所示:x = Solution().fn_one(strs)

【讨论】:

    【解决方案3】:

    您应该在使用fn_one 方法之前创建一个实例。像这样:

    代码:

    strs = ["ab", "abc", "abcs", "abx"]
    x = Solution()
    x.fn_one(strs)
    

    输出:

    >>> python3 test.py 
    ab
    

    或者,如果你把括号放在你的类之后,你可以在一行中完成。像这样:

    代码:

    strs = ["ab", "abc", "abcs", "abx"]
    x = Solution().fn_one(strs)
    

    输出:

    >>> python3 test.py 
    ab
    

    【讨论】:

      【解决方案4】:

      问题是你调用 fn_one 就好像是一个静态方法,所以你在你的方法 self 中接收字符串列表。

      您有多种选择:

      创建Solution的实例

      solution = Solution()
      x = solution.fn_one(strs)
      

      或者更改类定义,使 fn_one 成为静态方法

      class Solution:
          @staticmethod
          def fn_one(strs=[]):
              print(strs[0])
              return strs[0]
      

      【讨论】:

        【解决方案5】:

        试试这个代码。

        首先创建解决方案类的实例并调用 fn_one() 函数及其引用。

        代码:

        class Solution:
        
            def fn_one(self, strs):
                print(strs[0])
                return strs[0]
        
        
        strs = ["ab", "abc", "abcs", "abx"]
        x = Solution().fn_one(strs) 
        

        输出:

        ab
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-31
          • 2017-11-18
          相关资源
          最近更新 更多