[英]python and using 'self' in methods
根據我的閱讀/理解,'self'參數與'this'類似。
真的嗎?
如果它是可選的,如果自己沒有被傳入方法,你會怎么做?
是的,它以類似的方式使用。 請注意,它是一個位置參數,您可以根據需要調用它; 然而,有一個強烈的慣例稱之為self
(不是this
或其他任何東西)。 對於可用的實例方法, 必須有一些位置參數; 它不是可選的。
Python的樂趣
這在某種程度上是正確的。 方法綁定到它們所屬的對象實例。 當你看到
def some_func(self, foo, bar)
當你打電話時,自我的傳遞有時是隱含的,例如:
obj.some_func(foo_val, bar_val)
這是相等的(假設obj
是MyClass
類)
MyClass.some_func(obj, foo_val, bar_val)
因為該方法綁定到obj
,所以會填充self
參數。 這是Python明確表達意思的一部分。 在其他語言中, this
只是彈出范圍,Python有一些暴露如何發生。
您也可以通過方法周圍,並手動通過他們self
的時候不是從約束范圍內調用。
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.