在python中调用静态方法

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

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

在python控制台中,我导入Person类并调用Person.call_person() 。 但它给了我错误,说'module' object has no attribute 'call_person' 。 任何人都可以让我知道为什么我得到这个错误?


您需要执行以下操作:

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

根据你想要做什么,一个classmethod可能更合适:

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

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

现在回答你的实际问题。 我Person.py ,你没有找到你的方法,因为你已经把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'

每个人都已经解释了为什么这不是一个静态的方法,但我会解释你为什么没有找到它。 你正在寻找模块中的方法,而不是在类中,所以像这样的东西会找到它。

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

正如@DanielRoseman所说的,你可能已经想象到模块包含一个类似Java的类,尽管在Python中并非如此。


这不是一个静态的方法; 尝试

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

请参阅此处了解更多信息。

链接地址: http://www.djcxy.com/p/55137.html

上一篇: Calling static method in python

下一篇: Why does pycharm propose to change method to static