2016-03-21 3 views
1

Я родом из .NET и Javascript, и я работаю, чтобы узнать Python (для малины Pi).
Сейчас я пытаюсь выяснить OOP в Python и использовать методы и классы. Но имея небольшую проблему с @staticmethodМожно ли запустить print() внутри метода без атрибута @staticmethod?

class Car(object): 
    """description of class""" 

    def __init__(self, make, model): 
     self.make = make 
     self.model = model 

    @staticmethod 
    def makeFirstNoise(): 
     print("Vrooooommm!") 

    def makeSecondNoise(): 
     print("Mweeeeeeeeeh!") 

Вот как я реализую свой класс и пытаюсь запустить оба метода.

from Car import Car 

mustang = Car('Ford', 'Mustang') 
mustang.makeFirstNoise() 
mustang.makeSecondNoise() 

Это выход:

Vrooooommm! Traceback (most recent call last): File "D:\Dev\T\PythonHelloWorld\PythonHelloWorld\PythonHelloWorld.py", line 5, in <module> mustang.makeSecondNoise() TypeError: makeSecondNoise() takes 0 positional arguments but 1 was given

Так вопрос, почему я не могу выполнить второй метод без моего атрибута STATICMETHOD? Это похоже на работу, если я просто возвращает текст непосредственно, как это:

def makeSecondNoise(): 
    return "Mweeeeeeeh!" 

print(mustang.makeSecondNoise()) 

ответ

1

makeSecondNoise Причина вызывает ошибку, потому что это автоматически передается один аргумент, self, потому что она не объявлена ​​как staticmethod. self - это экземпляр класса, на который была вызвана функция. Это в конечном итоге вызывает ошибку, потому что makeSecondNoise не закодирован для принятия каких-либо параметров; это было бы, как это сделать:

def something(): 
    ... 
something("Foo") 

Вот пример того, как self работ:

>>> class Car: 
...  def makenoise(self): 
...   print(self) 
... 
>>> mustang = Car() 
>>> mustang.makenoise() 
<__main__.Car object at 0x0000000005498B38> # We can see that "self" is a reference to "mustang" 

Ваша проблема не связана с print (я не мог получить свой пример без print работать либо) - это связано с автоматическим прохождением аргумента self.

1

В Python все вызовы методов (помимо classmethods и staticmethods) явно передают экземпляр объекта в качестве первого аргумента. Конвенция должна называть этот аргумент self. Этот явный аргумент должен быть включен в подпись метода:

class Car(object): 
    def makeSecondNoise(self): # note that method takes one argument 
     print("Mweeeeeeeeeh!") 

После этого вы можете без проблем вызвать свой метод.

mustang = Car('Ford', 'Mustang') 
mustang.makeSecondNoise() 

В Java this (который представляет собой объект экземпляра) передается неявно методы - это источник вашей путаницы.