1. 程式人生 > >Python中預設引數self的理解

Python中預設引數self的理解

類的方法與普通的函式只有一個特別的區別——它們必須有一個額外的第一個引數名稱,但是在呼叫這個方法的時候你不為這個引數賦值,Python會提供這個值。這個特別的變數指物件本身,按照慣例它的名稱是self。

雖然你可以給這個引數任何名稱,但是強烈建議你使用self這個名稱——其他名稱都是不贊成你使用的。使用一個標準的名稱有很多優點——你的程式讀者可以迅速識別它,如果使用self的話,還有些IDE(整合開發環境)也可以幫助你。

給C++/Java/C#程式設計師的註釋Python中的self等價於C++中的self指標和Java、C#中的this參考。

你一定很奇怪Python如何給self賦值以及為何你不需要給它賦值。舉一個例子會使此變得清晰。假如你有一個類稱為MyClass和這個類的一個例項MyObject。當你呼叫這個物件的方法MyObject.method(arg1, arg2)的時候,這會由Python自動轉為MyClass.method(MyObject, arg1, arg2)——這就是self的原理了。

這也意味著如果你有一個不需要引數的方法,你還是得給這個方法定義一個self引數。


宣告add()方法時,若不加self,則提示

TypeError: add() takes exactly 2 arguments (3 given)
File "D:\PythonWorkplace\PythonDemo\Tet.py", line 15, in <module>
  test.add(1,3) 

錯誤。

拓展一下:

self在Python裡不是關鍵字。self代表當前物件的地址。self能避免非限定呼叫造成的全域性變數。

self是一種習慣,如上面的程式,把sayHi(self)換成sayHi(fles),同樣可以得到正確的輸出。

相關推薦

Python預設引數self理解

類的方法與普通的函式只有一個特別的區別——它們必須有一個額外的第一個引數名稱,但是在呼叫這個方法的時候你不為這個引數賦值,Python會提供這個值。這個特別的變數指物件本身,按照慣例它的名稱是self。雖然你可以給這個引數任何名稱,但是強烈建議你使用self這個名稱——其他名稱都是不贊成你使用的。使用一個標準

Python位置引數預設引數、可變引數、命名關鍵字引數、關鍵字引數的區別

Python中必選引數、預設引數、可變引數、命名關鍵字引數、關鍵字引數的區別: Num01–>必選引數(亦即位置引數): 定義:就是在給函式傳引數時,按照順序,依次傳值。 先寫一個下面的函式: def power(m, n): result=1

Python:函式定義預設引數正確方式和錯誤方式

正確的方式:def x_y_sum(x,y=20):    print("x={}".format(x))    print("y={}".format(y))        return x+yres1 = x_y_sum(10)print("res1={}".format

Python函式引數預設、列表、可變長度、字典型別)

#_*_coding:UTF-8_*_ # 1.預設引數 # 函式的引數支援預設。當某個引數沒有傳遞實際值時,函式將使用預設引數計算。例如,可以向login()函式的username引數和passwo

不可不知:函式預設引數的陷阱

現象 def foo(x, y=[]): y.append(x) return y print(foo(1)) print(foo(1, [3, 4])) print(foo(5)) ''' [1] [3, 4, 1] [1, 5] '''       

C++預設引數和函式過載

預設引數概念:        預設引數是宣告或定義函式時為函式的引數指定一個預設值,在呼叫該函式時,如果沒有指定實參則採用該預設值,否則使用指定的實參。 舉例說明: #include<malloc

Python對於反射的理解

反射簡單的理解:就是利用字串的形式去物件(模組)中操作(尋找/檢查/刪除/設定)(最簡單理解就是通過字串操作屬性)接下來讓我們記錄下反射的幾個方法: hasattr 判斷物件中是否有這個方法或變數 class Dog(object): def __init_

Python閉包的理解

定義 Python閉包表現為:如果在一個內部函式裡,對在外部作用域(非全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包(closure)。 def outer(a): b = 1 def inner(): # 內部函式in

Kotlin函式預設引數

Java不支援預設引數。但kotlin函式卻可以 package loaderman.demo class Customer(var name:String ="name"){//預設引數 init { print(name) } } pack

python類的self用法大全

在介紹Python的self用法之前,先來介紹下Python中的類和例項……  我們知道,面向物件最重要的概念就是類(class)和例項(instance),類是抽象的模板,比如學生這個抽象的事物,可以用一個Student類來表示。而例項是根據類創建出來的一個個具體的“物件”

Python__init__和self的意義和作用

由於類可以起到模板的作用,因此,可以在建立例項的時候,把一些我們認為必須繫結的屬性強制填寫進去。以學生類為例,通過定義一個特殊的__init__方法,在建立例項的時候,就把name,score等屬性綁上去: class Student(object): def __init__(self

關於Python面向物件的理解

1、什麼是面向物件 面向物件的程式設計的核心是物件(上帝式思維),要理解物件是什麼,就要把自己當成上帝,上帝眼裡世間存在的萬物皆物件,不存在的也可以創造出來。物件是特徵和技能的結合,其中特徵和技能分別對應物件的資料屬性和方法屬性。 2、優缺點 優點是: 便於維護,複用性強,具有很

關於Python引數定義及可變引數

在學習Python過程中,閱讀程式碼中,經常會遇到def f(x)或def f(**x)的函式,為了瞭解其定義,以下對其解釋: First, 函式的定義: def function(): pass 這是沒有引數的函式,本函式啥也不幹。

python函式引數的引用方式

值傳遞和引用傳遞時C++中的概念,在python中函式引數的傳遞是變數指向的物件的實體記憶體地址!!! python不允許程式設計師選擇採用傳值還是傳引用。Python引數傳遞採用的肯定是“傳物件引用”的方式。這種方式相當於傳值和傳引用的一種綜合。如果函式收到的是一個可變物件(比如字典或者列表)的引用,就能

python的getopt怎麼理解

在看crfascnn程式碼的demo時看到這個語句,上網查了一下,可以參考這個博文: demo中相關的程式碼以及我的解釋如下: try: opts, args = getopt.getopt(argv, 'hi:o:g:', ["ifile=",

python引數傳遞 * **

python中函式引數的傳遞是通過賦值來傳遞的。函式引數的使用又有倆個方面值得注意:1.函式引數是如何定義的 2.在呼叫函式的過程中引數是如何被解析 先看第一個問題,在python中函式引數的定義主要有四種方式:1.F(arg1,arg2,...)這 是最常見的定義方式,一個函式可以定義任意個引數,每個引數

pythonstrip()函式的理解

1、strip()函式 函式原型 宣告:s為字串,rm為要刪除的字元序列 s.strip(rm) :刪除s字串中開頭、結尾處,位於 rm刪除序列的字元 s.lstrip(rm) :刪除s字串中開頭處,位於 rm刪

python函式引數的引用與傳值

最近自己寫了個函式,實現numpy陣列180度旋轉的功能: import numpy as np def rotate(matrix): if matrix.ndim == 2: matrix = list(matrix)

Python函式預設引數陷阱,你知道嗎?

python可變物件做預設引數陷阱可變物件與不可變物件python中,萬物皆物件。python中不存在所謂的傳值呼叫,一切傳遞的都是物件的引用,也可以認為是傳址。python中,物件分為可變(mutable)和不可變(immutable)兩種型別。元組(tuple)、數值型(number)、字串(string

Python預設引數值

關於Python預設引數,假如預設引數是可變(mutable)物件是會有副作用的,一個函式引數的預設值,僅僅在該函式定義的時候,被賦值一次。如此,只有當函式第一次被定義的時候,才將引數的預設值初始化到它的預設值(如一個空的列表)如:>>> def funct