在 python 中调用静态方法

我有一个类 Person和一个名为 call_person的静态方法:

class Person:
def call_person():
print "hello person"

在 python 控制台中,我导入类 Person 并调用 Person.call_person()。但是它给我的错误说 'module' object has no attribute 'call_person'。有人能告诉我为什么我会得到这个错误吗?

135706 次浏览

你需要这样做:

class Person:
@staticmethod
def call_person():
print("hello person")


# Calling static methods works on classes as well as instances of that class
Person.call_person()  # calling on class
p = Person()
p.call_person()       # calling on instance of class

根据您希望执行的操作,类方法可能更合适:

class Person:
@classmethod
def call_person(cls):
print("hello person", cls)


p = Person().call_person() # using classmethod on instance
Person.call_person()       # using classmethod on class

这里的区别在于,在第二个示例中,类本身作为第一个参数传递给方法(与实例为第一个参数的常规方法或不接收任何附加参数的 staticmethod 相反)。

现在回答你的问题。我敢打赌,您没有找到您的方法,因为您已经将类 Person放到了模块 Person.py中。

然后:

import Person  # Person class is available as Person.Person
Person.Person.call_person() # this should work
Person.Person().call_person() # this should work as well

或者,您可能希望从模块 Person 导入类 Person:

from Person import Person
Person.call_person()

对于什么是模块,什么是类,这一切都有点令人困惑。通常,我尽量避免给类命名为它们所在的模块。然而,由于标准库中的 datetime模块包含一个 datetime类,因此这显然没有被过多地看不起。

最后,值得指出的是,对于这个简单的示例,您不能使用 需要类:

# Person.py
def call_person():
print("Hello person")

现在在另一个文件中,导入它:

import Person
Person.call_person() # 'Hello person'

这是 没有静态方法; 请尝试

class Person:
@staticmethod
def call_person():
print "hello person"

有关更多信息,请参见 给你

您需要添加 修饰类方法

每个人都已经解释了为什么这不是一个静态方法,但我将解释为什么你没有找到它。您要在模块中而不是在类中查找方法,这样类似的东西才能正确地找到它。

import person_module
person_module.Person.call_person() # Accessing the class from the module and then calling the method

另外,正如@DanielRoseman 所说,您可能想象过模块包含一个与 Java 同名的类,尽管在 Python 中并非如此。

在 python 3.x 中,可以像下面这样声明一个静态方法:

class Person:
def call_person():
print "hello person"

但是第一个参数为 self 的方法将被视为一个类方法:

def call_person(self):
print "hello person"

在 python 2.x 中,在静态方法之前必须使用 @staticmethod:

class Person:
@staticmethod
def call_person():
print "hello person"

还可以将 static 方法声明为:

class Person:
@staticmethod
def call_person(self):
print "hello person"