为什么删除 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 关键字设置为方法的参数然后代码运行时没有错误,这让我感到困惑。请解释这是为什么。
这里有两个代码片段
- 与
self
:
class Demo:
def show(self,x):
print("hello {0}".format(x))
o2 = Demo()
o2.show("world")
# Output:
# hello world
- 没有
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 中定义方法时,您必须包含一个强制性的第一个参数,例如self
在 x
参数之前,像这样
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
为什么它显示 xyz 方法采用 1 个参数,当我将单个参数传递给该方法时给出了 2 个参数,而且该方法具有单个参数。当我将 self 关键字设置为方法的参数然后代码运行时没有错误,这让我感到困惑。请解释这是为什么。
这里有两个代码片段
- 与
self
:
class Demo:
def show(self,x):
print("hello {0}".format(x))
o2 = Demo()
o2.show("world")
# Output:
# hello world
- 没有
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 中定义方法时,您必须包含一个强制性的第一个参数,例如self
在 x
参数之前,像这样
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