为什么删除 self 关键字后会出现 'method takes 1 arguments 2 is given ' 之类的错误?

Why we get error like 'method takes 1 arguments 2 is given ' after removing self keyword?

为什么它显示 xyz 方法采用 1 个参数,当我将单个参数传递给该方法时给出了 2 个参数,而且该方法具有单个参数。当我将 self 关键字设置为方法的参数然后代码运行时没有错误,这让我感到困惑。请解释这是为什么。

这里有两个代码片段

  1. self:
class Demo:
    def show(self,x):
        print("hello {0}".format(x))
o2 = Demo()
o2.show("world")

# Output:
# hello world
  1. 没有self:
class Demo:
    def show(x):
        print("hello {0}".format(x))
o2 = Demo()
o2.show("world")

# Output:
# Traceback (most recent call last):
#   File "main.py", line 7, in <module>
#     o2.show("ksr")
# TypeError: show() takes exactly 1 argument (2 given)

您调用该方法的实例隐含地是第一个参数(即 self)。所以在这里,该方法有两个参数 - o2 被调用,"ksr" 被传递给它,并且出错,因为它只需要一个参数。

当您在 class 中定义方法时,您必须包含一个强制性的第一个参数,例如selfx 参数之前,像这样

class Demo:
    def show(self, x):
        print("hello {0}".format(x))

self 是一个保存您的 Demo class 实例的变量。

您的方法目前只打印出 x,它不使用任何 class 变量。您可以通过使方法静态化来避免使用 self

class Demo:
    @staticmethod
    def show(x):
        print("hello {0}".format(x))

或者稍后在方法调用之前使用 staticmethod 关键字将其转换为静态

Demo.show = staticmethod(Demo.show)
o2 = Demo()
o2.show("world")

通常首选第一个选项。

Python 在 class 函数方面与其他语言略有不同。

如果在class中定义一个变量,它是一个属于class的静态变量,就好像class是一个对象。因为class一个对象。这是一个 python 字典。

当您创建 class 的实例时,python 复制 Dict 并为其指定一个新名称。

为了创建实例变量,您需要将它们附加到实例 Dict 而不是 class Dict。

为了避免混淆这两个字典 python 引入了 "self" 关键字。当 python 在实例 Dict 上调用函数时,它会将实例 Dict 的副本作为第一个参数传递给函数。

因此,要更改函数内的变量,您需要这样做:

class bicycle:
    numwheels = 2
    def __init__(self):
        # This is what python uses as the constructor
        self.numwheels = 3

    def changeInstanceWheels(self, wheelnum):
        self.numwheels = wheelnum
bike = bicycle()
print(bicycle.numwheels) # prints 2
print(bike.numwheels) # prints 3

bike.changeInstanceWheels(5)

print(bicycle.numwheels) # still prints 2 because this is the static variable
print(bike.numwheels) # prints 5