2016-03-21 13 views
1

.NET ve Javascript arka planından geliyorum ve Python'u (Raspberry Pi için) öğrenmek için yoldayım.
Şu anda Python'da OOP ve yöntem ve sınıfların kullanımını anlamaya çalışıyorum. Ancak @staticmethod@staticmethod özniteliği olmadan bir yöntem içinde bir yazdırma() çalıştırmak mümkün mü?

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!") 

Küçük bir sorunla karşılaştığımda sınıfımı nasıl uygularım ve her iki yöntemi de çalıştırmayı deniyorum.

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

Yani soru, neden benim durukyöntem özniteliği olmadan ikinci metodu olamaz:

from Car import Car 

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

Bu çıkış mı? Bir staticmethod olarak ilan değil çünkü otomatik bir argüman, self geçirilir çünkü

def makeSecondNoise(): 
    return "Mweeeeeeeh!" 

print(mustang.makeSecondNoise()) 

cevap

1

makeSecondNoise bir hataya neden olan sebebi: Bu benim sadece bu gibi metni doğrudan dönerseniz çalışıyor gibi görünüyor. self, işlevin çağrıldığı sınıfın örneğidir. Bu, hataya neden olur çünkü makeSecondNoise, herhangi bir parametreyi kabul etmek için kodlanmamıştır; bu yapıyor gibi olur: Burada

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

nasıl self çalıştığına dair bir örnek:

Senin sorunun (Ben çalışmak print olmadan örnek alamadım print ilişkili değildir
>>> 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" 

her iki) - self bağımsız değişkeninin otomatik geçişiyle ilgilidir.

1

Python'da tüm yöntem çağrıları (classmethods ve staticmethods dışında) nesne örneğini ilk argüman olarak açıkça geçti. Sözleşme, bu argümanı self olarak adlandırmaktır. Bu açık argüman yöntem imzası dahil edilmelidir:

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

Bundan sonra herhangi bir sorun olmadan yöntemini çağırabilir. Java'da

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

, this (örneğin nesneyi temsil eder) yöntemlerine örtülü olarak geçirilir - Bu karışıklık kaynağıdır.

İlgili konular