大家是如何理解Python中的self?

時間 2021-05-29 22:17:48

1樓:大胖子摩爾先生

武林外傳看過吧,秀才和那個殺手的對話,「是誰殺了我,而我又殺了誰」,直接讓那個殺手蒙蔽了,分不清楚誰是誰,而這個self的作用就是分清誰是誰,例項化是秀才就是秀才殺的,是殺手就是殺手殺的

2樓:[已重置]

self指的是類的例項屬性,例項化類後才有的東西cls指的類本身自有的屬性,在class裡面直接定義的變數乙個類可以有多個例項,多個instance,每個instance都有它自己的self屬性

python類的父類預設是object,使用乙個類的super()方法,就會調object的方法

例項大概的建立過程就是,呼叫類的__new_方法(預設是obj)建立了乙個新的例項,然後將*args, kwargs引數傳遞給_init_初始化,但無論是否是新建,類變數只在類建立時才會宣告一次,而例項在每次呼叫時都會初始化一次

3樓:0.382

class

people

:name

="Alice"

def__init__

(this

,_name

):this

.name

=_name

defhello

(this

):print(f

"Hello, my name is ")if__name__

=="__main__":a

=people

("Bob")a

.hello()

4樓:「已登出」

有個單機遊戲叫NBA 2K遊戲,裡面的生涯模式……這個生涯模式就是乙個類Mode

player = Mode()

於是,乙個球員就要被創造了……

但是創造球員時要設定身高,體重等初始值,就像Mode裡面的init函式,比如一些屬性要你輸入引數。於是player = Mode(arg1,arg2……)

self就表示你擁有的這個球員,每次 .方法, .屬性的時候,self就表示是你這個player,而不是另乙個player

5樓:

以self為字首的變數都可供類中的所有方法使用,還可以通過類的任何例項來訪問這些變數。在__init__初始化方法中self.name相當於定義了類的屬性。

6樓:python教程

Python中的self引數

7樓:諾天王

人類實力化出你,你自帶兩種屬性,資料屬性和函式屬性。身高體重,是你的資料屬性,做飯洗衣服是你的函式屬性。你就是這個self。

類例項化生成物件,物件就是self而這個self就是你。類的類稱之為父類,老祖宗叫元類。所以一切皆物件

8樓:鄒小末

定義乙個類:

class me():

def __init__(self,name,age):

#定義屬性名

self.name = name

self.age = age

#新建物件

def name(self):

print(「我的名字:」,self.name)#新建個例

xiaoming=me(「xm」,18)

xiaoming.name()

輸出:我的名字:xm

我自己的理解就是乙個全域性的變數,它的下面有自己的小屬性。在定義底下的物件時可以呼叫自己的屬性。

9樓:W3nl1nG

有個關鍵點沒有人回答:self並不是乙個keyword。你可以給第乙個引數起任何名字。

剩下的就如同其他人回答的一般了。

x = C()

x.f(a,b) == C.f(x,a,b)也就是在呼叫時把呼叫者當成第乙個引數傳給函式。

10樓:天色尚早

self代表乙個類的例項自身, 通過它來讀寫該例項的屬性。

class User:

def __init__(self, nameself.name = name #給例項屬性賦值

def get_name(selfreturn self.name

def rename(self, name): #self必須是第乙個引數,呼叫的時候不用寫

self.name = name

def rename_2(you, name): # 和上乙個函式一樣,self不是關鍵字,但必須是第乙個引數

you.name = name

def foo(name): # 會認為name是selfself.name = 'addd' # 出錯, 沒法引用self.name

return name.name # 沒錯,但是me = User('abcd') #不用User(self, 'abcd')

me.get_name() #不用self

me.get_name(me) #出錯,只有乙個引數給了兩個

me.rename('bbcc')

me.rename_2('cdcd') # 一樣執行,但是會被開除

me.rename(me,'dfll') #出錯,兩個引數給了三個

me.rename() #出錯,兩個引數,給了乙個

me.foo('ljkj') #出錯,乙個引數給了兩個

me.foo() #返回name

可見self隱含作為例項函式的第乙個引數。宣告要寫,呼叫不用寫。否則會出現引數不匹配。

不能省略,否則就和其他函式不能區分了,參見另乙個問題:

天色尚早:Python 中的 classmethod 和 staticmethod 有什麼具體用途?

11樓:陳困情

作為初學者,通過這個問題就能明白為什麼head first系列適合作為程式設計學習的第一本書。在head first python裡是這樣介紹self的,基本上可以終結這個問題。

就目前看過的學習資料來說,很多都對self和__init__這種非常基礎但是對物件導向程式設計思想有重要影響的內容一筆帶過或者乾脆不講,初學者隨便學學還好,追根究底的肯定要頭大好一段期間。斗膽揣測一下,估計不少經驗豐富的前輩都不一定像書裡這樣對這個問題知其然同時知其所以然。作為初學者深知學習任何新的領域打好地基非常關鍵,基礎的內容如果一直模稜兩可越往後慢慢會滾雪球一樣成為大問題,影響學習積極性。

所以真的建議後來者有空耐心看看head first系列,哪怕書裡很多內容一句話就你就可以掌握他卻用幾十頁的篇幅。

12樓:尋夢的zz

我覺得self是指向例項的指標。

比如,class student(object):

def prt(self):

print "xiaoming"

xiao=student()

xiao.prt()實際上就等於student.prt(xiao)xiao是需要傳遞給student類用於計算的指標

13樓:

從用法角度看,self就是類的例項,是呼叫class裡面方法的第乙個引數。class.method(instance, *arg),換成instance之後,即為instance.

method(*arg)。當然,也可以不使用self,從class級別使用。

如何理解 Python 的 Descriptor?

一起吃鰻魚飯啊 簡單來說,對與既支援函式式程式設計又支援物件導向式程式設計的語言來說,統一函式和類方法有兩種解決方案,一種是像Ruby一樣所有的callable都是類方法,或者像Python這樣,類方法只是帶有物件的特殊函式,descriptor就是為了解決這個而引入的。 影之心 描述器有三個特殊方...

如何理解python的sqlalchemy這種orm框架?

回答這個問題之前,首先讓我們回顧一下,乙個關聯式資料庫中都有什麼?沒錯,簡單來說,就是一張張表。表中又有什麼?行和列,一行就是一條記錄,一列就代表著一條記錄的某個屬性。舉例來說,乙個學籍資料庫可能包含一張學生資訊表,表中每行記錄著乙個學生的資訊,由很多列組成,每一列表示學生的乙個屬性,比如姓名 年齡...

python中def中def是如何實現的?

琉年 deff n def g passifn print g print in f else returngf 1 f 1 f 1 a f 0 print a a a f 0 print a a a f 0 print a a b f 0 print b b b f 0 print b b b f...