簡體   English   中英

python並在方法中使用'self'

[英]python and using 'self' in methods

根據我的閱讀/理解,'self'參數與'this'類似。

真的嗎?

如果它是可選的,如果自己沒有被傳入方法,你會怎么做?

是的,它以類似的方式使用。 請注意,它是一個位置參數,您可以根據需要調用它; 然而,有一個強烈的慣例稱之為self (不是this或其他任何東西)。 對於可用的實例方法, 必須有一些位置參數; 它不是可選的。

Python的樂趣

這在某種程度上是正確的。 方法綁定到它們所屬的對象實例。 當你看到

def some_func(self, foo, bar)

當你打電話時,自我的傳遞有時是隱含的,例如:

obj.some_func(foo_val, bar_val)

這是相等的(假設objMyClass類)

MyClass.some_func(obj, foo_val, bar_val)

因為該方法綁定到obj ,所以會填充self參數。 這是Python明確表達意思的一部分。 在其他語言中, this只是彈出范圍,Python有一些暴露如何發生。

您也可以通過方法周圍,並手動通過他們self的時候不是從約束范圍內調用。

Python文檔做得很好

xf = x.f
while True:
   print xf()

將繼續打印你好世界,直到時間結束。

調用方法時到底發生了什么? 您可能已經注意到xf()被調用>上面沒有參數,即使f()的函數定義指定了>參數。 這個論點怎么了? 當一個函數>需要一個參數被調用而沒有任何東西時,Python肯定會引發異常 - 即使參數實際上並未被使用...

實際上,您可能已經猜到了答案:方法的特殊之處在於>對象作為函數的第一個參數傳遞。 在我們的例子中,調用xf()>完全等同於MyClass.f(x)。 通常,使用n個參數列表調用方法>等效於使用創建的參數列表調用相應的函數>通過在第一個參數之前插入方法的對象。

self就是this ,只需要顯式傳遞它並明確地使用它來引用類方法/屬性。

它在類方法中不是可選的。 如果您嘗試定義一個沒有至少一個參數的類方法(即self參數),您將得到一個TypeError

但是,你可以稱之為self以外的東西,但我從來沒有見過。

在類中,需要self變量(或類方法的cls )。 你想要的是你的決定。 如果您願意,可以將其稱為this

classmethod是一種將class作為第一個參數而不是實例的方法。 可以在不傳遞實例的情況下調用它。 即使用classmethod你可以做:

SomeObject.some_class_method()

而正常的方法需要你這樣做

SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)

self指在其上調用該方法的目的,很象this在C ++中。 但重要的是, self只是一個約定 ,你可以根據自己的喜好命名並傳遞子類的實例。

self肯定與this類似,但是,在Python中, self這個名稱只是一個約定,可以命名為其他任何東西。 變量以函數原型中的任何名稱命名( def function(whatever, params...):

例如,方法,實際上需要self IS。 對於類或靜態方法,您需要指定它們應該被視為這樣,然后不需要self 例如:

def type_to_display(type):
    """Converts a pass type to the full written pass type."""
    return list((pair[1] for pair in Pass.TYPE_CHOICES if pair[0] ==      
                          type[0:1].upper()))[0]                          
type_to_display = staticmethod(type_to_display)      

你永遠不能以不傳入self的方式使用實例方法。例如,如果我有一個Car類的實例my_car ,並且我使用Car類的drive實例方法, my_car實例將是隱式地作為第一個參數( self )傳遞給drive方法。

class Car:
    def drive(self):
        self.do_some_stuff()

my_car = Car()
my_car.drive() # actually calls Car.drive(my_car)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM