在python中调用静态方法

Calling static method in python

我有一个类Person,该类中有一个名为call_person的静态方法:

1
2
3
class Person:
    def call_person():
        print"hello person"

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


你需要做如下的事情:

1
2
3
4
5
6
7
8
9
class Person(object): #always inherit from object.  It's just a good idea...
    @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

根据您想做什么,类方法可能更合适:

1
2
3
4
5
6
7
class Person(object):
    @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中。

然后:

1
2
3
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

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

1
2
from Person import Person
Person.call_person()

对于什么是模块,什么是类,这些都会变得有点混乱。通常,我尽量避免给类取与它们所在模块相同的名称。然而,这显然并没有被忽视太多,因为标准库中的datetime模块包含一个datetime类。

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

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

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

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


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

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

正如DanielRoseman所说的,你可能想象过,模块中包含了一个与Java相同名字的类,尽管在Python中不是这样的。


那不是静态方法;试试看

1
2
3
4
class Person:
    @staticmethod
    def call_person():
        print"hello person"

有关详细信息,请参阅此处。


在python 3.x中,可以声明一个静态方法,如下所示:

1
2
3
class Person:
    def call_person():
        print"hello person"

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

定义呼叫人(本人):打印"Hello Person"

但在python 2.x中,必须在静态方法之前使用"@static method"

1
2
3
4
class Person:
    @staticmethod
    def call_person():
        print"hello person"

也可以将静态方法声明为

1
2
3
4
class Person:
    @staticmethod
    def call_person(self):
        print"hello person"

您需要添加decorator类方法。