【问题标题】:How to add a method attribute?如何添加方法属性?
【发布时间】:2022-01-12 11:42:26
【问题描述】:

是否可以在python类中添加方法属性:

# something similar to this perhaps:
p.new_salary_getter = lambda(self, i) { return self.salaries[i] }

这是一个完整的示例上下文:

class Person:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

p = Person("oren", 28)
for i in range(12):
    if hasattr(p, "salaries"):
        salaries = getattr(p, "salaries")
        salaries[i] = 1000*i
    else:
        p.salaries = {i: 1000*i}

def getter(i: int) -> int:
    return self.salaries[i]

p.get_salary = getter
p.get_salary(7)

我得到的错误:

Traceback (most recent call last):
  File "main.py", line 18, in <module>
    p.get_salary(7)
  File "main.py", line 15, in getter
    return self.salaries[i]
NameError: name 'self' is not defined

【问题讨论】:

  • 您尝试此操作时发生了什么?它奏效了吗?有没有错误?
  • 请用您的实际代码更新您的问题完整的错误回溯。
  • 你似乎知道 {} 在 Pyhton 中的作用,不知道你为什么决定使用它们来定义 lambda
  • 要将方法添加到类中,您必须将其添加到类(而不是实例):Person.get_salary = getter。当然你必须提供self:def getter(self, i: int) -&gt; int:

标签: python methods attributes


【解决方案1】:

由于您现在正在定义自己的函数而不是使用 lambda,因此我将切换到该策略。

下面是一些“工作”的代码,其中类具有稍后添加的方法:

class Person:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

p = Person("oren", 28)

p.salaries = [1,2,3]

def getter(self, i: int) -> int:
    return self.salaries[i]

Person.get_salary = getter
print(p.get_salary(0))

输出:

1

【讨论】:

  • 谢谢,我求助于 getter 函数,因为我无法在问题的上下文中提供合理的东西(就语法错误而言)。实际上这两种格式对我都有好处(未来用户自行回答)
【解决方案2】:

TLDR lambda 样式:

Person.get_salary = lambda self, i: self.salaries[i]

未来的我:你错过了Person.lambda 没有return

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多