python def 方法应该有 "self" 作为第一个参数

python def Method should have "self" as first argument

我正在通过付费在线课程学习 python,但在学习模块和包时输入以下代码时出现错误。

class Fibonacci:
    def __init__(self, title="fibonacci"):
        self.title = title

    def fib(n):
        a, b = 0, 1
        while a < n:
            print(a, end=' ')
            a, b = b, a + b
        print()

    def fib2(n):
        result = []
        a, b = 0, 1
        while a < n:
            result.append(a)
            a, b = b, a + b
        return result

并且 def 显示错误,例如“def 方法应该将“self”作为第一个参数”。 你知道我为什么会出错吗?我认为我的代码应该没问题,当我尝试 运行 它通过我的朋友笔记本电脑 (window) 时它运行良好顺便说一句,我正在使用 mac os。 抱歉,我刚接触 python .. :) click to see the error here

----- 已编辑 ------------------ 感谢您的评论!而且我已经像图片edited code一样编辑了,没有错误! :)

但是当我尝试调用该函数时,出现类似 TypeError: fib() missing 1 required positional argument: 'n'

的错误
from pkg.fibonacci import Fibonacci

Fibonacci.fib(100)

查看 error message error message2

这是因为 class 中的所有函数必须有一个名为 self 的参数,如果你想将函数绑定到 class。

self represents the instance of the class. By using the self keyword we can access the attributes and methods of the class in python. It binds the attributes with the given arguments

试试这个

class Fibonacci:
  def __init__(self, title="fibonacci"):
    self.title = title

  def fib(self,n):
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a + b
    print()

  def fib2(self,n):
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a + b
    return result

参考Self in Python Class

编辑:

回答你的另一个问题

调用 class 函数时应使用对象。所以你必须在调用函数之前定义一个对象。

像这样

from pkg.fibonacci import Fibonacci
f = Fibonacci()
f.fib(100)

这更有可能是警告而不是错误。 并且警告说您正在将方法声明为 class 的一部分,但它并未真正绑定到任何对象(缺少自身)。如果你是故意这样做的,那就意味着你应该使用静态方法。

所以您可以继续将 self 添加到其他答案中建议的这两个函数,或者您可以使用 static methods

class Fibonacci:
    def __init__(self, title="fibonacci"):
        self.title = title

    @staticmethod
    def fib(n):
        a, b = 0, 1
        while a < n:
            print(a, end=' ')
            a, b = b, a + b
        print()

    @staticmethod
    def fib2(n):
        result = []
        a, b = 0, 1
        while a < n:
            result.append(a)
            a, b = b, a + b
        return result

你会这样称呼它 Fibonacci.fib(your_num_here)

不确定 fib / fib2 是否是 class 方法。

如果是,你可以在object参数中加上self,如

def fib(self, n)

然后你可以这样调用方法:

f = Fibonacci()
f.fib(5)

self 参数指的是 class 对象,所以你可以在 class 方法中使用 self 属性,在你的情况下,你可能有

def fib(self, n):
        a, b = 0, 1
        while a < n:
            print(a, end=' ')
            a, b = b, a + b
        print()
        print(self.title)