亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

對(duì)Python中class和instance以及self的用法詳解

 更新時(shí)間:2019年06月26日 10:47:33   作者:Hansry  
今天小編就為大家分享一篇對(duì)Python中class和instance以及self的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

一. Python 的類(lèi)和實(shí)例

在面向?qū)ο笾?,最重要的概念就是?lèi)(class)和實(shí)例(instance),類(lèi)是抽象的模板,而實(shí)例是根據(jù)類(lèi)創(chuàng)建出來(lái)的一個(gè)個(gè)具體的 “對(duì)象”。

就好比,學(xué)生是個(gè)較為抽象的概念,同時(shí)擁有很多屬性,可以用一個(gè) Student 類(lèi)來(lái)描述,類(lèi)中可定義學(xué)生的分?jǐn)?shù)、身高等屬性,但是沒(méi)有具體的數(shù)值。而實(shí)例是類(lèi)創(chuàng)建的一個(gè)個(gè)具體的對(duì)象, 每一個(gè)對(duì)象都從類(lèi)中繼承有相同的方法,但是屬性值可能不同,如創(chuàng)建一個(gè)實(shí)例叫 hansry 的學(xué)生,其分?jǐn)?shù)為 93,身高為 176,則這個(gè)實(shí)例擁有具體的數(shù)值。

1.類(lèi):以Student類(lèi)為例,在Python中,定義類(lèi)如下:

class Student(object):
  def __init__(self,name,score):
    self.name=name
    self.score=score

a.(object)表示的是該類(lèi)從哪個(gè)類(lèi)繼承下來(lái)的,而object類(lèi)是每個(gè)類(lèi)都會(huì)繼承的一個(gè)類(lèi)。 yt

b. __init__ 方法的第一參數(shù)永遠(yuǎn)是 self,用來(lái)表示類(lèi)創(chuàng)建的實(shí)例本身,因此,在 __init__ 方法內(nèi)部,就可以把各種屬性綁定到self,因?yàn)閟elf 本身就是指向創(chuàng)建的實(shí)例本身。

c. 有了 __init__ 方法后,在創(chuàng)建實(shí)例的時(shí)候,就不能傳入空參數(shù),必須傳入與 __init__ 方法匹配的參數(shù),但self本身不需要傳入?yún)?shù),只需要傳入 self 后面的參數(shù)即可。

2.實(shí)例: 定義好了類(lèi)后,就可以通過(guò)Student類(lèi)創(chuàng)建出 Student 的實(shí)例,創(chuàng)建實(shí)例是通過(guò) 類(lèi)名 + ()實(shí)現(xiàn):

student = Student('name', 93)

>>> student.name
"name"
>>> student.score
93

a. 其中 Student 是類(lèi)名稱(chēng),('name',93)為要傳入的參數(shù)

b. self.name 就是 Student類(lèi)的屬性變量,為 Student 類(lèi)所有。同時(shí), name 是外部傳來(lái)的參數(shù),不是 Student 類(lèi)所自帶的。故 self.name = name 的意思就是把外部傳來(lái)的參數(shù) name 的值賦值給 Student類(lèi)自己的屬性變量 self.name .

3.和普通函數(shù)相比,在類(lèi)中定義函數(shù)只有一點(diǎn)不同,就是第一參數(shù)永遠(yuǎn)是類(lèi)的本身實(shí)例變量 self, 并且調(diào)用時(shí),不用傳遞該參數(shù)。 除此之外,類(lèi)的方法(函數(shù))和普通函數(shù)沒(méi)有啥區(qū)別。既可以用 默認(rèn)參數(shù)、可變參數(shù)或者關(guān)鍵字參數(shù)等。

二. 類(lèi) 以及 實(shí)例的訪問(wèn)

1.限制外部對(duì)類(lèi)實(shí)例屬性的訪問(wèn)

既然 Student 類(lèi)實(shí)例本身就擁有這些屬性的數(shù)據(jù),那么要訪問(wèn)這些數(shù)據(jù),就沒(méi)必要從外面的函數(shù)去訪問(wèn),而可以在類(lèi)的內(nèi)部定義訪問(wèn)數(shù)據(jù)的函數(shù),這樣,就可以把 ”數(shù)據(jù)“ 封裝起來(lái)了。這些封裝數(shù)據(jù)的函數(shù)和 Student 類(lèi)本身是相關(guān)聯(lián)的,稱(chēng)之為類(lèi)的方法:

class Student(obiect):
  def __init__(self, name, score):
    self.name = name
    self.score = score
  def print_score(self):
    print "%s: %d" % (self.name, self.score)
>>> student= Student("hansry",99)
>>> student.print_property()

hansry:99

由此可見(jiàn),從外部看Student類(lèi),我們只知道創(chuàng)建實(shí)例需要給出 name 和 score。究竟如何打印,是 Student 類(lèi)內(nèi)部定義的,這些數(shù)據(jù)和邏輯被封裝起來(lái)了,調(diào)用也就變得容易了,但是不知道內(nèi)部實(shí)現(xiàn)的細(xì)節(jié)。

如果不想讓實(shí)例中的內(nèi)部屬性被外部屬性訪問(wèn),則把 name 和 score 變成 __name 和 __score 即可,如下代碼所示:

class Student(object):

  def __init__(self, name, score):
    self.__name = name
    self.__score = score
  def print_property(self):
    print "%s: %d" %(self.__name,self.__score)
>>> student= Student("hansry",99)
>>> student.print_property()
>>> student.__name()

hansry:99
Traceback (most recent call last):
AttributeError: 'Student' object has no attribute '__name'

2.開(kāi) API 使得外部代碼能夠訪問(wèn)到里面的屬性,并且對(duì)其進(jìn)行修改

外部代碼訪問(wèn)到類(lèi)實(shí)例屬性,代碼如下:

  def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def get_name(self):
    return self.__name

  def get_score(self):
    return self.__score 
name=student.get_name()
score=student.get_score()
print ("%s,%d" % (name,score))

外部代碼修改類(lèi)里面的實(shí)例屬性,代碼如下:

  def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def reset_name(self,change_name):
    self.__name = change_name

  def reset_score(self, change_score):
    self.__score = change_score 
student= Student("hansry",99)
student.print_property()
student.reset_name("simona")
student.reset_score(91)
name=student.get_name()
score=student.get_score()
print ("%s:%d" % (name,score))

hansry:99
simona:91

需要注意的是,在Python中,變量名類(lèi)似 _xxx_的,也就是雙下劃線開(kāi)頭,并且以下劃線結(jié)尾的,是特殊變量,特殊變量是可以直接訪問(wèn)的,不是 private 變量,不能用 __name__, __score__ 。

三. self 的仔細(xì)用法

1.self代表類(lèi)的實(shí)例,而非類(lèi)。

class Student(object):
  def print_self(self):
    print(self)
    print(self.__class__)
student=Student()
student.print_self()

<__main__.Student object at 0x7fd9095aed90>
<class '__main__.Student'>

從上面例子可得,self代表的只是類(lèi)的實(shí)例,而 self.__class__ 才是類(lèi)。

2. 定義類(lèi)的時(shí)候,self最好寫(xiě)上,因?yàn)樗砹祟?lèi)的實(shí)例。

3. 在繼承時(shí),傳入的是哪個(gè)實(shí)例,就是那個(gè)傳入的實(shí)例,而不是指定義了self的類(lèi)的實(shí)例。

class Teacher(object):
  def __init__(self,teacher):
    self.teacher=teacher
    print(self.teacher)

  def print_self(self):
    print(self)

class Student(Teacher):
  def __init__(self,student):
    self.student=student    
    print(self.student)

  def print_self_1(self):
    print(self)
teacher=Teacher("hansry")
student=Student("simona")
student.print_self_1()
student.print_self()

hansry
simona
<__main__.Student object at 0x7fd9095b0950>
<__main__.Student object at 0x7fd9095b0950>

在運(yùn)行 student.print_self() 的時(shí)候,這里是調(diào)用了 類(lèi) Teacher 的 print_self() 函數(shù),此時(shí)雖然調(diào)用的是 類(lèi)Teacher的函數(shù),但是此時(shí)的實(shí)例 self 確是 類(lèi) Student 實(shí)例化時(shí)生成的。

以上這篇對(duì)Python中class和instance以及self的用法詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python函數(shù)基礎(chǔ)

    Python函數(shù)基礎(chǔ)

    這篇文章主要從函數(shù)開(kāi)始介紹展開(kāi)Python函數(shù),以最基本的函數(shù)定義方法描述,需要的朋友可以參考下文簡(jiǎn)單的介紹
    2021-08-08
  • Pytest生成測(cè)試報(bào)告的實(shí)現(xiàn)

    Pytest生成測(cè)試報(bào)告的實(shí)現(xiàn)

    本文介紹了如何使用 pytest-html 插件生成測(cè)試報(bào)告,并提供了詳細(xì)的操作步驟、配置項(xiàng)和示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Python面向?qū)ο笤砼c基礎(chǔ)語(yǔ)法詳解

    Python面向?qū)ο笤砼c基礎(chǔ)語(yǔ)法詳解

    這篇文章主要介紹了Pyhton面向?qū)ο笤砼c基礎(chǔ)語(yǔ)法,結(jié)合實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中的基本原理、概念、語(yǔ)法與相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01
  • 基于Tensorflow使用CPU而不用GPU問(wèn)題的解決

    基于Tensorflow使用CPU而不用GPU問(wèn)題的解決

    今天小編就為大家分享一篇基于Tensorflow使用CPU而不用GPU問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • python使用NumPy文件的讀寫(xiě)操作

    python使用NumPy文件的讀寫(xiě)操作

    這篇文章主要介紹了python使用NumPy讀寫(xiě)文本文件。想了解第三方庫(kù)文件操作的同學(xué),來(lái)看一下吧
    2021-04-04
  • Python本地及虛擬解釋器配置過(guò)程解析

    Python本地及虛擬解釋器配置過(guò)程解析

    這篇文章主要介紹了Python本地及虛擬解釋器配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼

    Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼

    大家好,本篇文章主要講的是Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • DataFrame窗口函數(shù)rolling()的用法

    DataFrame窗口函數(shù)rolling()的用法

    這篇文章主要介紹了DataFrame窗口函數(shù)rolling()的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Django數(shù)據(jù)庫(kù)遷移常見(jiàn)使用方法

    Django數(shù)據(jù)庫(kù)遷移常見(jiàn)使用方法

    這篇文章主要介紹了Django數(shù)據(jù)庫(kù)遷移常見(jiàn)使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • PyTorch中的CUDA的操作方法

    PyTorch中的CUDA的操作方法

    這篇文章主要介紹了PyTorch中的CUDA的操作方法,CUDA是NVIDIA推出的異構(gòu)計(jì)算平臺(tái),PyTorch中有專(zhuān)門(mén)的模塊torch.cuda來(lái)設(shè)置和運(yùn)行CUDA相關(guān)操作,更多相關(guān)介紹,需要的朋友可以查看下面文章內(nèi)容
    2022-08-08

最新評(píng)論