玩弄Python
,我遇到了一个错误类型takes 2 positional arguments but 3 were given
。我的方法是在一个类中,它的形式是
def add(x, y):
return x +y
我刚刚阅读了关于类的基本文档,并且意识到了@classmethod
and修饰符的存在@staticmethod
,文档中说这些修饰符基本上是“语法糖”。我也知道self
orcls
不是保留字,所以如果我的第一个参数被调用self
,cls
或者x
.
获得的错误让我认为默认情况下,类的方法被认为是类方法(并且第一个参数被认为是对类/实例的引用),如果我希望它们是静态的,那么我必须放置修饰符,但不是我在文档中没有发现任何明确说明这一点的内容。
这似乎很明显,但对我来说,如果我宣布
def saludar() :
print("hola")
在类中,调用将失败,因为该函数有 0 个参数,但我们将尝试在调用中传递一个(隐式)参数。有人可以确认方法是类默认值,就好像它们被注释一样@classmethod
?
默认情况下,类的方法按如下方式工作:
案例 1:实例方法
没有
@classmethod
or的类@staticmethod
。正如您所提到的,self
或者cls
不是保留字,但建议在 Python 中维护面向对象编程的标准:事实上,一个类的所有方法都需要引用该实例。如您所见,我什至没有使用
self
.这是等价的,虽然有点傻,但它演示了如何使用类的实例调用方法:
除非您使用
@classmethod
我们将在案例 2中看到的那样,否则无法在中间没有实例的情况下调用该方法:案例 2:类方法
一个类
@classmethod
。@classmethod
通过用你对 Python 说的话来装饰一个方法是:“Python,以防万一我想在没有实例的情况下使用该方法,所以不要给我”废话self
。Python 会告诉你:“好的,但是然后给我一个类的引用。” 同样,您不需要使用cls
:这个类甚至没有构造函数,它是一个无意义的类,只是向你打招呼,但你可以在不需要类的实例的情况下调用它。你可以这样做:
该方法
desde_nombre
实际上所做的是返回该类的一个实例。在这种情况下,科学性并不多,但在接收到的数据与构造函数的参数不匹配的复杂情况下非常有用。案例 3:静态方法
与
@staticmethod
.self
简而言之,你对 Python 说的是“Python,我要创建一个没有实例和类的方法,所以不要给我or ”废话cls
。Python 会回答:“你知道你可以在没有类的情况下做到这一点,对吧?” con 方法@staticmethod
实际上是从类中调用函数的一种优雅方式,因为它既不接收实例也不接收类本身。就我个人而言,我已经使用过几次,但我遇到过这种方法可能与您在课堂上处理的数据密切相关的情况,并且您希望将所有内容保存在同一个地方。也就是说,与其在另一个模块中创建“帮助”函数,不如在与某种验证相同的类中创建它:
简而言之,这或多或少是类在 Python 中的工作方式。
Python 中类的方法默认是实例方法,它们需要对相关对象的引用。
如果您查看 Wikipedia Method_(computing),它会区分实例方法和类或静态方法,在 Python(与其他语言不同)中,类和静态方法是两个不同的东西。这是因为类本身也是对象。
Python 中的实例方法需要对实例的显式引用,因此会出现错误
takes 2 positional arguments but 3 were given
。语法糖是解释器负责将实例的引用作为方法的第一个参数传递,这就是为什么self
在方法声明中需要它而不是调用方法时对实例的引用。形式:instancia.metodo()
.类方法是类对象的实例方法,在 Python 中类也是对象。为了向解释器表明该方法不属于类的实例,而是属于类对象本身,@classmethod装饰器是必要的。由于每个实例方法都需要对执行它的对象的引用,在这种情况下
cls
. 非常self
它们cls
是任意的词,但惯例是使用这样的词,以符合Python 的禅宗哲学,即应该只有一种明显的方式来做某事。它们通常用作__init__
.最后,静态方法是一个函数(它不需要对象或类引用即可工作),但它需要@staticmethod装饰器,这样解释器就不会将其作为实例方法。
使用代码看起来更好。如果我们定义类
Clase
和实例:Clase
是类型类型的对象,instancia
的对象,是类型的对象Clase
:metodo_instancia
直到不属于类的实例是一个函数,'function'(在 Python 2 中,它是一个'unbound method'):但是一旦它属于实例,它就变成了“绑定方法”,一个链接到所述实例的方法:
类方法
metodo_clase
是类的绑定方法:在这两种情况下,它都充当工厂(在我们的类实现中
Clase
)来创建 type 的新对象Clase
:最后,
metodo_estatico
在类和实例中都是相同的函数:在 Python 中,方法默认是实例方法。
在 Python 中有三种类型的方法:
static
:他们接收类作为第一个参数,相当于在其他语言中标记为方法。