最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python類方法中的self關(guān)鍵字使用

 更新時(shí)間:2023年12月27日 10:15:05   作者:m0_38063172  
這篇文章主要介紹了python類方法中的self關(guān)鍵字使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

之前學(xué)python爬蟲的時(shí)候要把函數(shù)封裝到類里面,寫成類方法,知道在python的類方法中第一個(gè)參數(shù)應(yīng)該是self,但對(duì)self代表的具體意義不甚了了。

最近在看Java,對(duì)面向?qū)ο缶幊痰牧私飧嗔艘稽c(diǎn),終于徹底弄明白self到底是什么了。

Python的類

在python中,所有的類都直接或間接繼承自O(shè)bject類,定義了類之后就定義了一個(gè)命名空間,里面定義的屬性可以通過類名來引用。

新定義的類中有一些Object中有的屬性,可以在其中定義其他變量或者函數(shù)。實(shí)例化之后會(huì)創(chuàng)建一個(gè)對(duì)象,該對(duì)象脫胎于類,并且其中的屬性動(dòng)態(tài)地和類中的屬性產(chǎn)生關(guān)聯(lián):

class A:
    pass
   
a = A()

這段代碼創(chuàng)建了一個(gè)類A,并且對(duì)它進(jìn)行了實(shí)例化,實(shí)例化之后的對(duì)象綁定為變量a。

我可以看看A里面和a里面分別有什么:

In [38]: dir(A)
Out[38]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']
In [39]: dir(a)
Out[39]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']

用dir函數(shù)輸出A中和a中的屬性后,我們可以看到A和a中的屬性是一樣的。

我們可以向其中添加屬性,添加屬性時(shí)必須初始化:

In [40]: A.b
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-40-ebcfc7dbf31a> in <module>()
----> 1 A.b

AttributeError: type object 'A' has no attribute 'b'
In [41]: A.b = 1

現(xiàn)在我們可以看看A和a中的屬性發(fā)生了什么變化:

In [42]: dir(A)
Out[42]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'b']
In [43]: dir(a)
Out[43]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'b']
In [74]: A.b
Out[74]: 1

In [75]: a.b
Out[75]: 1

我們可以看到,在A中和它的實(shí)例化對(duì)象中現(xiàn)在都有了屬性b,而且它們的值相等。

如果我們給A的實(shí)例化對(duì)象中添加屬性呢:

In [44]: a.c = 2

In [45]: hasattr(a, c)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-45-15d927c71e90> in <module>()
----> 1 hasattr(a, c)

NameError: name 'c' is not defined

竟然報(bào)錯(cuò)了,c沒有定義,報(bào)錯(cuò)的原因是A的實(shí)例化對(duì)象a的命名空間中有c,但是公共命名空間中沒有c,所以我們?cè)僭囈淮危?/p>

In [58]: c = a.c

In [59]: hasattr(a, 'c')
Out[59]: True

In [60]: hasattr(A, 'c')
Out[60]: False

我們可以看到,a中有c,但是A中并沒有c。是不是因?yàn)閏指向的是a.c所以A中沒有呢:

In [61]: b = a.b

In [62]: hasattr(A, 'b')
Out[62]: True

確實(shí)是因?yàn)樵陬惖膶?shí)例化對(duì)象中添加的屬性不會(huì)加入類中。

我們接著看給A或a中加入函數(shù)屬性會(huì)發(fā)生什么:

In [78]: A.foo = lambda x : x + 1

In [79]: A.foo(1)
Out[79]: 2

In [80]: a.foo(1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-80-7dc85fd7a693> in <module>()
----> 1 a.foo(1)

TypeError: <lambda>() takes 1 positional argument but 2 were given

python方法函數(shù)中的self關(guān)鍵字

上面執(zhí)行"a.foo(1)"語句時(shí)有個(gè)報(bào)錯(cuò),說只需要一個(gè)參數(shù),但是給了兩個(gè)參數(shù),這第二個(gè)參數(shù)是怎么來的,為什么A.foo(1)就不會(huì)出錯(cuò)。

這里我們可以引出python類中的方法函數(shù),方法函數(shù)指的是通過類的實(shí)例化對(duì)象調(diào)用的函數(shù),方法函數(shù)的第一個(gè)形參表示類的實(shí)例化對(duì)象,通常寫成self。

執(zhí)行a.foo(1)時(shí)就相當(dāng)于執(zhí)行A.foo(a,1),因?yàn)锳.foo()中只有一個(gè)形參,傳入的參數(shù)多于需要的參數(shù),所以發(fā)生類型錯(cuò)誤。

我們?cè)贏的定義中重新定義foo:

class A:
    def foo(self, n):
        print(n+1)
   
a = A()

現(xiàn)在我們?cè)赼中調(diào)用foo就不會(huì)有問題了:

In [85]: a.foo(1)
2

我們也可以試試調(diào)用A.foo:

In [86]: A.foo(a, 1)
2

總結(jié)

python的類中定義函數(shù)時(shí)的self關(guān)鍵字跟python的方法函數(shù)有關(guān),方法函數(shù)由類的實(shí)例化對(duì)象調(diào)用,需要把調(diào)用它的實(shí)例化對(duì)象傳入方法函數(shù)中,self即是表示實(shí)例化對(duì)象的形參。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Django博客系統(tǒng)注冊(cè)之創(chuàng)建用戶模塊應(yīng)用

    Django博客系統(tǒng)注冊(cè)之創(chuàng)建用戶模塊應(yīng)用

    本文主要介紹了Django博客系統(tǒng)注冊(cè)之創(chuàng)建用戶模塊應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • wxPython:python首選的GUI庫實(shí)例分享

    wxPython:python首選的GUI庫實(shí)例分享

    wxPython是Python語言的一套優(yōu)秀的GUI圖形庫。允許Python程序員很方便的創(chuàng)建完整的、功能鍵全的GUI用戶界面。 wxPython是作為優(yōu)秀的跨平臺(tái)GUI庫wxWidgets的Python封裝和Python模塊的方式提供給用戶的
    2019-10-10
  • Python列表切片操作實(shí)例總結(jié)

    Python列表切片操作實(shí)例總結(jié)

    這篇文章主要介紹了Python列表切片操作,結(jié)合實(shí)例形式總結(jié)分析了Python列表切片常見操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-02-02
  • python?opencv實(shí)現(xiàn)目標(biāo)外接圖形

    python?opencv實(shí)現(xiàn)目標(biāo)外接圖形

    這篇文章主要為大家詳細(xì)介紹了python?opencv實(shí)現(xiàn)目標(biāo)外接圖形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 3段Python圖像處理的實(shí)用代碼的分享

    3段Python圖像處理的實(shí)用代碼的分享

    這篇文章主要介紹了3段Python圖像處理的實(shí)用代碼的分享,計(jì)算機(jī)視覺方向的Python實(shí)用代碼,用到多種庫具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • python清華pip鏡像源報(bào)HTTP error 403錯(cuò)誤解決辦法

    python清華pip鏡像源報(bào)HTTP error 403錯(cuò)誤解決辦法

    這篇文章主要介紹了如何解決在使用pip安裝Python包時(shí)遇到的403錯(cuò)誤,提供了三種解決方法,并強(qiáng)調(diào)了清除緩存以使更改生效的重要性,需要的朋友可以參考下
    2024-12-12
  • Python 實(shí)現(xiàn)「食行生鮮」簽到領(lǐng)積分功能

    Python 實(shí)現(xiàn)「食行生鮮」簽到領(lǐng)積分功能

    今天我們就用 Python 來實(shí)現(xiàn)自動(dòng)簽到,省得我每天打開 APP 來操作了。感興趣的朋友跟隨小編一起看看吧
    2018-09-09
  • python定時(shí)任務(wù)sched庫用法簡單實(shí)例

    python定時(shí)任務(wù)sched庫用法簡單實(shí)例

    sched可用于定時(shí)任務(wù),唯一需要注意的就是,這些任務(wù)在一個(gè)線程中運(yùn)行,如果前面的任務(wù)耗時(shí)過長,則后面的任務(wù)將順延執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于python定時(shí)任務(wù)sched庫用法的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Python列表與元組操作實(shí)現(xiàn)過程

    Python列表與元組操作實(shí)現(xiàn)過程

    本文介紹了Python中對(duì)列表進(jìn)行排序、臨時(shí)排序、反轉(zhuǎn)列表、確定列表長度、遍歷列表、避免縮進(jìn)錯(cuò)誤、創(chuàng)建數(shù)值列表、列表解析、切片和復(fù)制列表、以及元組的基本用法
    2025-12-12
  • python和shell監(jiān)控linux服務(wù)器的詳細(xì)代碼

    python和shell監(jiān)控linux服務(wù)器的詳細(xì)代碼

    這篇文章主要為大家介紹了使用python和shell監(jiān)控linux服務(wù)器的詳細(xì)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評(píng)論

衡水市| 包头市| 招远市| 昌乐县| 大丰市| 赣州市| 灵璧县| 益阳市| 榆树市| 徐闻县| 来安县| 贵南县| 鹰潭市| 平阴县| 寻乌县| 兰考县| 宁陕县| 石城县| 安多县| 青海省| 南陵县| 茂名市| 拉萨市| 海晏县| 吴旗县| 阜南县| 六安市| 台湾省| 同仁县| 大邑县| 中方县| 集安市| 迭部县| 封丘县| 洮南市| 阜城县| 香格里拉县| 留坝县| 汨罗市| 图们市| 若尔盖县|