2017-12-03 183 views
2

我是python(來自C++世界)的新手,正在嘗試使用類方法。我創建了一個沒有任何參數的方法(在這種情況下有目的地避免了self參數)。然後我試圖把它調用沒有結構的python類方法

class car: 

    def car_method(): 
     print("Inside Car method") 


obj = car_method() 
obj.car_method() <---- this creates error: TypeError: car_method() takes 0 positional arguments but 1 was given 

我認爲這個錯誤是因爲,在Python中,每類方法,調用時總是通過至少一個參數,它是對象的引用。我對麼?

然後進一步實驗,我寫了

obj.car_method  <----- assuming I am not passing any argument to it 

但功能打印什麼。

然後我試圖使用打印它的類型

print(obj.car_method)

這就造成了

bound method car.car_method of <__main__.car object at 0x005D2290>

任何人能解釋這是怎麼回事。我如何「調用」car_method?如果沒有辦法調用car_method,爲什麼python讓我定義沒有任何參數的方法?

我想在這裏掌握一些基礎知識。我甚至可以將car_method作爲類方法調用嗎?或者它只是在類中定義的方法?

+0

在寫最後一句話'我甚至可以稱之爲car_method作爲類方法?或者它只是在類內部定義的一個方法而已',我意識到可能它的行爲是不同的,經過進一步的實驗,我意識到,它確實是一個類方法,可以在類中使用,但不喜歡'self.car_method )'。這仍然會導致錯誤。但是如果將它稱爲'car_method()',就可以正常工作,前提是你不要在任何其他類方法中使用它!它可以用作類屬性! – legameeternoforall

回答

0

在python類的方法是通過這樣定義:

class MyObj(object): 

    def my_method(self): 
     pass 

總是至少一個第一參數,它是該實例本身。

2

在Python中,該類的所有方法都會隱式地接收類對象的實例作爲第一個參數。

Python中的一般做法是將類方法中的第一個參數命名爲self,它類似於C和Java類語言中的this。唯一的區別是,它不是保留關鍵字,您可以任何名稱。儘管使用self是一個通用慣例,因爲它對Python程序員和Python文檔,IDE解析器更具可讀性。 Read the docs

您可以使用self訪問跨類方法的類方法和變量。一個非常簡單的例子,顯示自我的用例:

In [37]: class car: 
    ...:  def __init__(self): 
    ...:   self.car_name = 'Jaguar' 
    ...: 
    ...:  def car_method(self): 
    ...:   print("I can access " + self.car_name + " because I have 
    ...: self") 
    ...:   print("Inside Car method") 
    ...: 
    ...:  def another_method(self): 
    ...:   # this calls car_method 
    ...:   self.car_method() 
    ...: 

In [38]: c = car() 

In [39]: c.another_method() 
I can access Jaguar because I have self 
Inside Car method 

如果你想要一個classmethod。你可以在Python中定義一個類方法,如:

class car: 

    @classmethod 
    def car_method(cls): 
     print("Inside Car method") 

car_method方法頂部的小東西@classmethod被稱爲在Python decorator。但即使在類方法中,類實例也作爲car_method中的參數傳遞。

如果你想調用你的方法car_method沒有參數,並且不需要訪問類/實例變量(這些稱爲靜態方法)。您可以使用@staticmethod裝飾器將您的方法定義爲靜態方法。

class car: 

    @staticmethod 
    def car_method(): 
     print("Inside Car method") 

這裏沒有self作爲參數傳遞,並且可以調用car_method爲car().car_method()

爲什麼Python的允許創建car_method即使自我作爲參數傳遞?

這是因爲Python不是像C那樣的靜態類型。它是一種動態語言。不同於靜態類型語言,所有的類型,函數參數等檢查發生在運行時在Python

要了解更多關於@classmethod和@staticmethod裝飾,read about @classmethod and @staticmethod in this awesome SO thread

+0

感謝您的迴應,你提到的是'classmethod'和'staticmethod',但我想知道什麼是一個類中的方法,而不是它們之一?它的行爲如何,其優點/用途以及我如何稱呼它?我在發佈帖子後添加了評論,所以請評論一下。我很想知道這一點! – legameeternoforall

+0

@legameeternoforall在答案中增加了一個示例。我建議你閱讀我附加的文檔。它爲Python中的OOP提供了一個非常好的開始。 –

+0

@legameeternoforall如果您覺得這對您有用,請隨時[接受我的回答](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 :-) –

相關問題