2012-06-06 6 views
8

Можно создать дубликат:
What is the difference between @staticmethod and @classmethod in Python?Python Статические методы, почему?

У меня есть несколько вопросов о staticmethods в классах. Я начну с примера.

Пример один:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(): 
     return "Hello %s, your age is %s" % (self.first + self.last, self.age) 

x = Static("Ephexeve", "M").printInfo() 

Выходы:

Traceback (most recent call last): 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 90, in <module> 
    x = Static("Ephexeve", "M").printInfo() 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 88, in printInfo 
    return "Hello %s, your age is %s" % (self.first + self.last, self.age) 
NameError: global name 'self' is not defined 

Пример два:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(first, last, age = randint(0, 50)): 
     print "Hello %s, your age is %s" % (first + last, age) 
     return 

x = Static("Ephexeve", "M") 
x.printInfo("Ephexeve", " M") # Looks the same, but the function is different. 

Выходы

Hello Ephexeve M, your age is 18 

Я вижу, что я не могу назвать любой self.attribute в staticmethods, я просто не уверен, когда и зачем его использовать. На мой взгляд, если вы создадите класс с несколькими атрибутами, возможно, вы захотите использовать их позже, и не будете иметь staticmethod, где все атрибуты не подлежат вызову. Кто-нибудь может мне это объяснить? Python - это мой первый программный langunge, поэтому, если это то же самое в Java, например, я не знаю.

+0

Ненависть для голосования, чтобы закрыть, но ответы на вопрос, который я связал, являются довольно хорошими. Обратите внимание, что '@ classmethod' похож на javas' static'. '@ staticmethod' практически бесполезен. –

+0

Спасибо, Джош, возможно, я не искал должным образом, спасибо за ссылку, сейчас проверю –

ответ

8

Что вы пытаетесь достичь с этим staticmethod? Как вы ожидаете, что он решит вашу проблему, если вы не знаете, что она делает?

Или вы просто играете, чтобы посмотреть, что делает staticmethod? В этом случае, вероятно, было бы более полезно сообщить read the docs, что он делает, вместо того, чтобы случайным образом применять его и пытаться угадать поведение, что он делает.

В любом случае применение @staticmethod к определению функции в классе делает «статический метод». «Статический», к сожалению, один из самых запутанных перегруженных терминов в программировании; здесь это означает, что метод не зависит или не изменяет состояние объекта. Если у меня есть статический метод foo, определенный в классе Bar, то вызов bar.foo(...) (где bar - это некоторый экземпляр класса Bar) будет делать то же самое, независимо от того, что содержит атрибуты bar. Действительно, я могу назвать это непосредственно из класса как Bar.foo(...), когда у меня даже нет экземпляра!

Это достигается просто не передачей экземпляра в статический метод, поэтому статические методы не имеют параметра self.

Статические методы редко необходимы, но иногда удобны. Они действительно такие же, как простые функции, определенные за пределами класса, но помещение их в класс обозначает их как «связанных» с классом. Вы обычно использовали их для вычисления или выполнения вещей, которые тесно связаны с классом, но фактически не являются операциями над каким-либо конкретным объектом.

Смежные вопросы