Подтвердить что ты не робот

Вызов статического метода в python

У меня есть класс Person и статический метод в этом классе под названием call_person:

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

В консоли python я импортирую класс Person и вызываю Person.call_person(). Но это дает мне ошибку, которая говорит 'module' object has no attribute 'call_person'. Может кто-нибудь, пожалуйста, дайте мне знать, почему я получаю эту ошибку?

4b9b3361

Ответ 1

Вам нужно сделать что-то вроде:

class Person(object): #always inherit from object.  It 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

В зависимости от того, что вы хотите сделать, метод class может быть более уместным:

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 в модуль 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'

Ответ 2

Все уже объяснили, почему это не статический метод, но я объясню, почему вы его не находите. Вы ищете метод в модуле, а не в классе, поэтому что-то вроде этого найдет его правильно.

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

Также, как сказал @DanielRoseman, вы могли подумать, что модули содержат класс с таким же именем, как Java, хотя это не относится к Python.

Ответ 3

Это не статический метод; попробуйте

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

Подробнее см. здесь.

Ответ 4

В python 3.x вы можете объявить статический метод следующим образом:

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

но метод с первым параметром как self будет рассматриваться как метод класса

def call_person (self):   напечатать "привет человек"

но в python 2.x вы должны использовать '@staticmethod' перед статическим методом

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

вы также можете объявить статический метод как это

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