简单但太多的方法调用位置参数

时间:2019-08-24 20:07:48

标签: python class methods self

  1. 谁能解释为什么[Unit] Description=App [Service] ExecStart=sudo /usr/bin/python3 /home/pi/script.py WorkingDirectory=/home/pi/ Restart=always User=pi [Install] WantedBy=multi-user.target

      

    fib()接受1个位置参数,但给定2个参数。

    当我只给它一个参数=> TypeError

  2. 还可以在保留类实例化的同时,提出解决问题的解决方案?

  3. 我觉得“自我”使用过多,尤其是在添加的更多方法中。可以改善吗?

只是想把我的头放在一些基础知识上!感谢所有反馈。

self.fib(self.n - 1)

5 个答案:

答案 0 :(得分:2)

方法的第一个参数是self,它指向方法被调用的 object 。如所显示的,如果您希望传递参数(看起来像n),则需要在方法的签名中包含该参数。

答案 1 :(得分:1)

此函数接受一个参数self,但以下行:self.fib(self.n - 1)尝试传递2:selfself.n - 1

答案 2 :(得分:1)

当您第一次在

中调用fib()时
  

print(first_func.fib())

除了隐式self外,您不传递任何参数。在下一个调用中,您传递1 arg,使其变为2(包括隐式self)

  

self.fib(self.n-1)

这提供了TypeError:fib()接受1个位置参数,但给出了2个

有关斐波那契的简单实现:

def fib(n):
    if n==0 or n==1:
        return 1
    else:
        return (fib(n-1) + fib(n-2))

答案 3 :(得分:1)

类型错误可能意味着很多事情。在这种情况下,这意味着您向函数传递了太多参数。看起来您正在使用参数调用 self.fib 。您仅使用 self 作为参数定义了它。从您编写代码的方式来看,您似乎认为需要将 self 作为参数传递。事实是,它是一个不可见的参数,在调用函数时已经传递了。

做这样的事情:

class math_func:
        def __init__(self, '''...'''):
            #...
        def fib(self):
            #...
            self.n = self.n - 1
            self.fib()

class math_func:
        def __init__(self, '''...'''):
            #...
        def fib(self):
            #...
            self.fib2(self.n -1)
        def fib2(self, n: int):
            #...
            #same thing as fib with slight changes

class math_func:
    def __init__(self, '''...'''):
        #...
    def fib(self, n: int):
        #...
        self.fib(self.n - 1)
    def getN(self):
        return self.n

fib = math_func('''...''')
print(fib.fib(fib.getN())

答案 4 :(得分:0)

您需要将n包含在fib的内容中

def fib(self, n):
...

还有一点补充:如果您定义递归函数,则应考虑使用lru_cache装饰器以提高性能。

from functools import lru_cache

...

@lru_cache(500) # 500 is the cache size
def fib(self, n):
...