【问题标题】:Unsupported operand type using sum function使用 sum 函数的不支持的操作数类型
【发布时间】:2018-06-18 17:14:09
【问题描述】:

这是一个包含重现我的错误的代码的 sn-p。为什么 sum 函数将类实例而不是数字传递给减法?

class my_class():
    def __init__(self):
        pass

    def __subtract (x,y, n=1):
        return (x - y)**n

    def num_generator(self, num):
        example_list = []
        for idx in range(num):
            example_list += [idx]

        expression = {y: sum(self.__subtract(x, y) for x in example_list) for y in range(min(example_list), max(example_list) + 1)}
        no_vals = max(expression.items(), key=operator.itemgetter(1))[0]
        return no_vals

chosen_no = 20
class_instance = my_class()
class_instance.num_generator(chosen_no)

错误:

TypeError: unsupported operand type(s) for -: 'my_class' and 'int'

我已经盯着这个看了 20 分钟,对我来说这毫无意义。

【问题讨论】:

  • 将您的 __subtract 方法设为静态或添加 self

标签: python python-3.x oop runtime-error


【解决方案1】:

在:

def __subtract (x,y, n=1):
    return (x - y)**n

由于__subtract 是一个实例方法,x 将当前对象表示为第一个参数(不,self 不是关键字)。

默认参数使其无法检测到,这说明 python 不会抱怨参数的数量。当你打电话时:

self.__subtract(x, y)

在调用中,所有参数都被转移,y 占据了n 默认参数槽:

def __subtract (yourobject => x, x => y, y => n):

您的方法不需要对象状态,因此只需添加 @staticmethod 装饰器

@staticmethod
def __subtract (x,y, n=1):
    return (x - y)**n

顺便说一句,替换下面繁琐且性能不佳的代码:

    example_list = []
    for idx in range(num):
        example_list += [idx]

通过

example_list = list(range(num))

【讨论】:

  • 我忘了添加自我???好吧,这真的很尴尬。谢谢,现在就像一个魅力。
  • @Quubix 你没有在函数中使用 self 。我会按照 Jean-Francois 的建议将其设为 staticmethod。更多信息:stackoverflow.com/questions/136097/…
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 2022-12-05
  • 2021-08-17
  • 1970-01-01
  • 2020-07-27
  • 2017-07-15
相关资源
最近更新 更多