python中的“静态方法”是什么

python中的“静态方法”是什么,python,static-methods,Python,Static Methods,我对python非常陌生,无法理解python中的静态方法是什么,例如\uuuu new\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。有人能解释一下吗?非常感谢你已经读过了吗 尤其是这个 解释 在OOP中,定义稍后实例化的类。一个类不过是一个蓝图:一旦你从一个类实例化了对象,你的对象就会完全遵循你的类蓝图。这意味着:如果在类中定义一个名为abc的字段,那么稍后在对象中就会有一个字段abc。如果在类中定义了一个方法f

我对python非常陌生,无法理解python中的静态方法是什么,例如\uuuu new\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。有人能解释一下吗?非常感谢你已经读过了吗

尤其是这个

解释 在OOP中,定义稍后实例化的类。一个类不过是一个蓝图:一旦你从一个类实例化了对象,你的对象就会完全遵循你的类蓝图。这意味着:如果在类中定义一个名为abc的字段,那么稍后在对象中就会有一个字段abc。如果在类中定义了一个方法foo,那么稍后将在对象上调用一个方法foo

请注意,这对您的对象是至关重要的:您总是实例化一个类,然后可以调用该方法。这是正常的方式

静态方法是不同的。虽然一个普通的方法总是需要一个实例,在这个实例中,您可以在静态方法中调用这个方法,但静态方法不需要。静态方法独立于实例而存在,这就是为什么它被命名为static。因此,静态方法与类定义本身相关联,因此始终存在,因此只能在类本身调用。它完全独立于所有实例

这是一种静态方法

Python的实现有点。。。好易于理解的具体而言,与上述描述存在偏差。但这并没有什么区别:为了与OOP概念保持一致,您应该始终使用如上所述的方法

实例 让我们举个例子:

FooBar类: def someMethodself: 印刷ABC 这是一个常规实例方法。您可以这样使用它:

myObj=FooBar myObj.someMethod 如果你有

myObjB=FooBar myObjB.someMethod 。。。您有一个额外的实例,因此在第二个实例上调用someMethod将是调用第二个someMethod方法-在第二个对象上定义。这是因为您在使用之前实例化了对象,所以所有实例都遵循定义的blueprint FooBar。因此,所有实例都会收到someMethod的某种副本

实际上,Python将在内部使用优化,因此实际上只有一段代码在内存中实现someMethod,但现在先忘掉这一点。对于程序员来说,类的每个实例都会有方法someMethod的副本。这是与我们相关的抽象层次,因为这是我们工作的表面。在编程或脚本语言的实现中,情况可能有点不同,但这不是很相关

让我们看一看静态方法:

FooBar类: @静力学方法 定义静态方法: 印刷ABC 这样的静态方法可以如下调用:

FooBar.someStaticMethod 如您所见:没有实例。您可以在类本身的上下文中直接调用此方法。虽然常规方法在特定实例本身上工作-它们通常修改该实例本身内的数据-但类方法不会。它可以修改静态!数据,但通常不会

将静态方法视为一种特殊情况。很少需要它。如果编写代码,您通常希望的不是实现静态方法。只有在非常特定的情况下,实现静态方法才有意义

自参数 请注意,标准实例方法必须始终将self作为第一个参数。这是一个特定于python的代码。在现实世界中,Python当然会!即使实例化了类的数千个对象,也只在内存中存储一次方法。认为这是一个优化。如果随后在数千个实例中的一个实例上调用方法,则始终会调用同一段代码。但是为了区分方法的代码应该在哪个特定对象上工作,您的实例将作为第一个参数传递给这个内部存储的代码段。这是自我论证。它是某种隐式参数,对于常规实例方法来说总是需要的。不是:静态方法-在这里,您不需要实例来调用它们

因为这个参数是隐式的,并且总是需要的,所以大多数编程语言都会将它隐藏给程序员,并在内部以正确的方式处理它。不管怎样,揭露这一特殊论点并没有多大意义

不幸的是,Python没有遵循这一原则。Python不会隐藏这个隐式必需的参数。Python对OOP概念的结合有点。。。易于理解的因此,在方法上你几乎处处都能看到自我。在您看来,您可以忽略它,但如果您定义自己的类,则需要显式地编写它。为了以一种好的方式组织你的程序,你应该这样做

静态方法__ Python非常特别。而常规编程语言遵循严格的 对于如何创建特定类的实例这一不变的概念,Python在这里有点不同。这种行为是可以改变的。此行为在_unew _;中实现。所以如果你这么做

myObj=FooBar 。。。Python隐式地调用FooBar.\uuuuNew\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!在类中定义为实例方法,然后返回完全初始化的实例。在本例中,这个实例就是存储在myObj中的内容


如果需要,可以修改此行为。但这需要一个非常不寻常的用例。在使用Python的整个工作中,您可能永远不会与“新”本身有任何关系。我的建议:如果你对Python不太熟悉,就忽略它。

你已经读过这篇文章了吗

尤其是这个

解释 在OOP中,定义稍后实例化的类。一个类不过是一个蓝图:一旦你从一个类实例化了对象,你的对象就会完全遵循你的类蓝图。这意味着:如果在类中定义一个名为abc的字段,那么稍后在对象中就会有一个字段abc。如果在类中定义了一个方法foo,那么稍后将在对象上调用一个方法foo

请注意,这对您的对象是至关重要的:您总是实例化一个类,然后可以调用该方法。这是正常的方式

静态方法是不同的。虽然一个普通的方法总是需要一个实例,在这个实例中,您可以在静态方法中调用这个方法,但静态方法不需要。静态方法独立于实例而存在,这就是为什么它被命名为static。因此,静态方法与类定义本身相关联,因此始终存在,因此只能在类本身调用。它完全独立于所有实例

这是一种静态方法

Python的实现有点。。。好易于理解的具体而言,与上述描述存在偏差。但这并没有什么区别:为了与OOP概念保持一致,您应该始终使用如上所述的方法

实例 让我们举个例子:

FooBar类: def someMethodself: 印刷ABC 这是一个常规实例方法。您可以这样使用它:

myObj=FooBar myObj.someMethod 如果你有

myObjB=FooBar myObjB.someMethod 。。。您有一个额外的实例,因此在第二个实例上调用someMethod将是调用第二个someMethod方法-在第二个对象上定义。这是因为您在使用之前实例化了对象,所以所有实例都遵循定义的blueprint FooBar。因此,所有实例都会收到someMethod的某种副本

实际上,Python将在内部使用优化,因此实际上只有一段代码在内存中实现someMethod,但现在先忘掉这一点。对于程序员来说,类的每个实例都会有方法someMethod的副本。这是与我们相关的抽象层次,因为这是我们工作的表面。在编程或脚本语言的实现中,情况可能有点不同,但这不是很相关

让我们看一看静态方法:

FooBar类: @静力学方法 定义静态方法: 印刷ABC 这样的静态方法可以如下调用:

FooBar.someStaticMethod 如您所见:没有实例。您可以在类本身的上下文中直接调用此方法。虽然常规方法在特定实例本身上工作-它们通常修改该实例本身内的数据-但类方法不会。它可以修改静态!数据,但通常不会

将静态方法视为一种特殊情况。很少需要它。如果编写代码,您通常希望的不是实现静态方法。只有在非常特定的情况下,实现静态方法才有意义

自参数 请注意,标准实例方法必须始终将self作为第一个参数。这是一个特定于python的代码。在现实世界中,Python当然会!即使实例化了类的数千个对象,也只在内存中存储一次方法。认为这是一个优化。如果随后在数千个实例中的一个实例上调用方法,则始终会调用同一段代码。但是为了区分方法的代码应该在哪个特定对象上工作,您的实例将作为第一个参数传递给这个内部存储的代码段。这是自我论证。它是某种隐式参数,对于常规实例方法来说总是需要的。不是:静态方法-在这里,您不需要实例来调用它们

因为这个参数是隐式的,并且总是需要的,所以大多数编程语言都会将它隐藏给程序员,并在内部以正确的方式处理它。这并不是真的让穆 无论如何,我都不想暴露这个特殊的论点

不幸的是,Python没有遵循这一原则。Python不会隐藏这个隐式必需的参数。Python对OOP概念的结合有点。。。易于理解的因此,在方法上你几乎处处都能看到自我。在您看来,您可以忽略它,但如果您定义自己的类,则需要显式地编写它。为了以一种好的方式组织你的程序,你应该这样做

静态方法__ Python非常特别。虽然常规编程语言遵循如何创建特定类实例的严格且不变的概念,但Python在这里有点不同。这种行为是可以改变的。此行为在_unew _;中实现。所以如果你这么做

myObj=FooBar 。。。Python隐式地调用FooBar.\uuuuNew\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!在类中定义为实例方法,然后返回完全初始化的实例。在本例中,这个实例就是存储在myObj中的内容


如果需要,可以修改此行为。但这需要一个非常不寻常的用例。在使用Python的整个工作中,您可能永远不会与“新”本身有任何关系。我的建议:如果您对Python不太熟悉,请忽略它。

要了解什么是“新的”,请参阅此处的详细说明。这是否回答了您的问题?要理解什么是新的,请看这里的解释。这回答了你的问题吗?男人回答得真好!我非常喜欢你的解释。请注意,staticmethod可以在实例和类上以任何方式调用。它只是将两者都作为第一个参数接收。事实上,任何方法都可以以任何一种方式调用,但如果以“不寻常”的方式使用,则必须手动传递右第一个参数。@deceze:没错。但我建议不要这样做,因为它违反了OOP概念的干净方法。仅仅因为Python允许您做特定的事情,并不意味着您真的应该做这些事情。脚本/编程语言只不过是一个工具箱。由您决定哪些工具有意义,哪些没有意义。大多数情况下,所有工具都是经过仔细定义的,而且意义重大。在Python中有点不同:有时有些工具没有多大意义,有些工具甚至完全丢失了…@Mario:谢谢你,我感谢你的夸奖。我可以告诉你:这些年来,我花了很多心思。当然,但其中一个例子就是:lst.sortkey=str.upper。您提供了str类的一个方法,它名义上是一个实例方法,但在这里没有实例,但是由于sort调用它的方式,它的行为就像在那个实例上被调用一样。因此,了解这些东西在Python中是如何工作的,而不是保持抽象的OOP,这是非常有用的!我非常喜欢你的解释。请注意,staticmethod可以在实例和类上以任何方式调用。它只是将两者都作为第一个参数接收。事实上,任何方法都可以以任何一种方式调用,但如果以“不寻常”的方式使用,则必须手动传递右第一个参数。@deceze:没错。但我建议不要这样做,因为它违反了OOP概念的干净方法。仅仅因为Python允许您做特定的事情,并不意味着您真的应该做这些事情。脚本/编程语言只不过是一个工具箱。由您决定哪些工具有意义,哪些没有意义。大多数情况下,所有工具都是经过仔细定义的,而且意义重大。在Python中有点不同:有时有些工具没有多大意义,有些工具甚至完全丢失了…@Mario:谢谢你,我感谢你的夸奖。我可以告诉你:这些年来,我花了很多心思。当然,但其中一个例子就是:lst.sortkey=str.upper。您提供了str类的一个方法,它名义上是一个实例方法,但在这里没有实例,但是由于sort调用它的方式,它的行为就像在那个实例上被调用一样。因此,了解这些东西在Python中是如何工作的,而不是将其保持为抽象的OOP,这是非常有用的。