python類中方法和屬性的分類概述

本文出自“阿敏其人”簡書技術(shù)博客,轉(zhuǎn)載請注明出處送滞。
文/阿敏其人


一寸谜、類的創(chuàng)建

創(chuàng)建格式

class 類名:

    def 方法1(self, 參數(shù)列表):
        pass

.
來個例子

class Dog:
    """這是一個狗類"""

    def eat(self):
        print("吃香喝辣")

# 創(chuàng)建示例
d1 = Dog();

.
.

類的屬性和方法 初探

在類里面可以直接定義 屬性 和 方法,跟其他語言類似健蕊。

__dir__方法

在python里,我們可以通過 __dir__ 查看當前實例的所有的方法和屬性踢俄。
(并不是所有的實例擁有的屬性和方法都是一樣多的缩功,待會會談到)

代碼

class Phone:
    """一個簡單的類實例"""
    phoneColor = "經(jīng)典黑"

    def f(self):
        return 'hello'


# 實例化類
x = Phone()

# 訪問類的屬性和方法
print("Phone 類的屬性 phoneColor 為:%s" % x.phoneColor)
print("Phone 類的方法 f 輸出為: %s" % x.f())
print("Phone類的對象 x 所有的屬性和方法: %s" % x.__dir__())

.
輸出

Phone 類的屬性 i 為:經(jīng)典黑
Phone 類的方法 f 輸出為: hello
Phone 所有的屬性和方法: ['__module__', '__doc__', 'phoneColor', 'f', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

Process finished with exit code 0

通過dir列出的內(nèi)容,我們的Phone的實例有一個 phoneColor 的屬性褪贵。

.
.

二掂之、關(guān)于方法

類的所有方法幾乎必帶的 self 形參

  • 類的所有的方法都必須帶有一個self的形參,但是調(diào)用時不需要傳值(靜態(tài)方法和類方法除外)脆丁。
  • self代表類的對象世舰,不是類!由 哪一個對象 調(diào)用的方法槽卫,方法內(nèi)的 self 就是 哪一個對象的引用跟压,在類封裝的方法內(nèi)部,self 就表示 當前調(diào)用方法的對象自己歼培。(類方法除外)
  • 調(diào)用方法時震蒋,不需要傳遞 self 參數(shù)
  • self 這個詞不是指定的關(guān)鍵字茸塞,換成 abcd 什么的也行,只是叫做 self 含義較好查剖。
class Test:
    def showAdd(self):
        print(self) # print(self)  可以打印出對象的地址
        print(self.__class__) # self.__class__ 可以指向真正類


t = Test()
t.showAdd()

.
輸出

<__main__.Test object at 0x108d17e80>
<class '__main__.Test'>

self.class 可以指向真正類

.
.

init() 初始化方法

  • 類的初始化會調(diào)用 init() 的特殊方法(構(gòu)造方法)钾虐,開發(fā)時經(jīng)常在定義類時重寫該方法,做初始化操作笋庄。

代碼

class Phone(object):
    """一個簡單的類實例"""

    def __init__(self,brand,size):
        self.brand = brand
        self.size = size

# 實例化類
x = Phone("MI","5寸")

# 訪問類的屬性和方法
print("類對象 brand:%s" % x.brand)
print("類對象 size : %s" % x.size)
print("Phone類的對象對象 x 所有的屬性和方法: %s" % x.__dir__())

.

類對象 brand:MI
類對象 size : 5寸
Phone 所有的屬性和方法: ['brand', 'size', '__module__', '__doc__', '__init__', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

Process finished with exit code 0

初始化演示完畢效扫,需要注意的是:brand和size,是Phone類的對象的屬性直砂,不是Phone類的屬性菌仁。

.
.

類的方法的分類: 公有方法、私有方法静暂、靜態(tài)方法和類方法

公有方法

公有方法:方法名前后都帶有__济丘,比如module
定義方式:def namemethod(self)
調(diào)用方式:對象名.公有方法


私有方法

私有方法私有方法:方法名只有前面帶有__,比如 __testPrivate洽蛀。

定義方式:def __namemethod(self)
調(diào)用方式:self._namemethod摹迷。注意:不能通過對象名直接調(diào)用。只能在屬于對象的方法中通過self調(diào)用辱士,或者在外部通過python的壓縮規(guī)則進行調(diào)用泪掀。
(后文會結(jié)合私有屬性听绳,附上例子)


類方法

類方法
可以直接通過類名調(diào)用颂碘,也可以通過類的實例訪問
靜態(tài)方法和類方法都無法訪問類實例屬性,能通過類訪問類屬于類屬性椅挣。
類方法头岔,第一個參數(shù)必須要默認類,一般習(xí)慣用cls鼠证。類方法的形參 cls峡竣,代表類本身

定義方式
@classmethod
def methodname(cls)

常見場景
類方法用在模擬java定義多個構(gòu)造函數(shù)的情況。


靜態(tài)方法

靜態(tài)方法

可以直接通過類名調(diào)用量九,也可以通過類的實例訪問适掰。
靜態(tài)方法和類方法都無法訪問類實例屬性,能通過類訪問類屬于類屬性荠列。
靜態(tài)方法對參數(shù)沒有要求

定義方式
@staticmethod
def methodname()

調(diào)用方式:類名.方法名


常見場景
類中靜態(tài)方法方法調(diào)用靜態(tài)方法的情況类浪。

靜態(tài)方法和類方法的簡單對比

1、兩者都可以通過類對象或類名訪問肌似;靜態(tài)方法和類方法都無法訪問實例變量的费就,但可以通過類名訪問類屬性。
2川队、靜態(tài)方法和類方法力细,可以減少 創(chuàng)建多實例時 所創(chuàng)造出來的內(nèi)存空間睬澡,加快運行速度。

.
.
代碼

class Phone(object):
    """一個簡單的類實例"""

    age = 18

    def __init__(self,brand,size):
        self.brand = brand
        self.size = size

    def normalMethod(self):
        print("方法  normalMethod 被調(diào)用 %s" % self)

    def pubTest(self):
        print("公有方法  pubTest 被調(diào)用 %s" % self)

    def __pubTestOther__(self):
        print("公有方法  __pubTestOther__ 被調(diào)用 %s" % self)


    def __privateTest(self):
        print("私有方法  __privateTest 被調(diào)用 %s" % self)
        pass

    @staticmethod
    def staticTest(): # 靜態(tài)方法不需要默認的 self 或者 cls 作為形參
        print("靜態(tài)方法  staticTest 被調(diào)用")
        print(Phone.age) # 靜態(tài)方法需要通過 類名.屬性 來訪問屬性

    @classmethod
    def classTest(cls):
        print("類方法  classTest 被調(diào)用 %s" % cls)
        print("類方法  訪問類的屬性 %s" % Phone.age)


# 實例化類
x = Phone("MI","5寸")

print("Phone類的對象對象 x 所有的屬性和方法: %s" % x.__dir__())

print("")
print("*"*10, "公有方法 開始", "*"*10)
x.pubTest()

print("*"*10, "公有方法 結(jié)束", "*"*10)

print("")
print("*"*10, "私有方法 開始", "*"*10)
print("私有方法無法直接通過 類對象 或者 類名 訪問")
print("*"*10, "私有方法 結(jié)束", "*"*10)

print("")
print("*"*10, "靜態(tài)方法 開始", "*"*10)
x.staticTest()
Phone.staticTest()
print("*"*10, "靜態(tài)方法 結(jié)束", "*"*10)

print("")
print("*"*10, "類方法 開始", "*"*10)
x.classTest()
Phone.classTest()
print("*"*10, "類方法 結(jié)束", "*"*10)

.
.
打用呗臁:

Phone類的對象對象 x 所有的屬性和方法: ['brand', 'size', '__module__', '__doc__', 'age', '__init__', 'normalMethod', 'pubTest', '__pubTestOther__', '_Phone__privateTest', 'staticTest', 'classTest', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

********** 公有方法 開始 **********
公有方法  pubTest 被調(diào)用 <__main__.Phone object at 0x107aa02e8>
********** 公有方法 結(jié)束 **********

********** 私有方法 開始 **********
私有方法無法直接通過 類對象 或者 類名 訪問
********** 私有方法 結(jié)束 **********

********** 靜態(tài)方法 開始 **********
靜態(tài)方法  staticTest 被調(diào)用
18
靜態(tài)方法  staticTest 被調(diào)用
18
********** 靜態(tài)方法 結(jié)束 **********

********** 類方法 開始 **********
類方法  classTest 被調(diào)用 <class '__main__.Phone'>
類方法  訪問類的屬性 18
類方法  classTest 被調(diào)用 <class '__main__.Phone'>
類方法  訪問類的屬性 18
********** 類方法 結(jié)束 **********

.
.

三煞聪、關(guān)于屬性

1:實例屬性:

最好在__init__(self,...)中初始化,內(nèi)部調(diào)用時都需要加上self.

2:類屬性:

__init__()外初始化
類的實例或者直接通過類名都可以訪問

3:私有屬性:

1逝慧、單下劃線開頭:告訴別人這是私有屬性米绕,但是外部依然可以訪問更改
2、雙下劃線
_開頭:外部不可訪問馋艺。無論是類名還是類實例栅干。

(python中沒有絕對真正的私有屬性)

.
.

實例屬性示例代碼

  • 一個類的對象可以通過點語法為當前類的對象添加一個屬性,但這種方式添加的屬性只屬于這個屬于對象捐祠,是實例屬性屬性碱鳞。

代碼

class Dog:
    """這是一個狗類"""

    def eat(self):
        print("吃香喝辣")


dog = Dog();


print(dog.__dir__())
dog.name = "大白"  
print(dog.__dir__())

# 通過 __dir__ 的打印對比,我們可以很明顯地發(fā)現(xiàn)踱蛀,dog.name = "大白"  執(zhí)行過后窿给,該對象多了一個 名為 name 的屬性,這個屬性只屬于這個實例
print(dog.name)

dog2 = Dog() # dog2并沒有 name 這個屬性
print(dog2.__dir__())

.
輸出

['__module__', '__doc__', 'eat', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

['name', '__module__', '__doc__', 'eat', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
大白
['__module__', '__doc__', 'eat', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

Process finished with exit code 0

.
.

訪問私有屬性和私有方法 示例

代碼

class PriTest(object):
    # 私有屬性
    __priMem = "Jill"
    # 私有方法
    def __privateMethod(self):
        print("i ma a private metoid")


pt = PriTest()
# 利用python的壓縮規(guī)則率拒,我們依然可以調(diào)用到 私有方法崩泡。 但是不建議這么做。
#私有屬性和方法的處理方式:在 名稱 前面加上 _類名 => _類名__名稱
pt._PriTest__privateMethod()
print(pt._PriTest__priMem)

.
輸出

i ma a private metoid
Jill

Process finished with exit code 0

.
.
END.
謝謝閱讀猬膨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末角撞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子勃痴,更是在濱河造成了極大的恐慌谒所,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沛申,死亡現(xiàn)場離奇詭異劣领,居然都是意外死亡,警方通過查閱死者的電腦和手機铁材,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門尖淘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人著觉,你說我怎么就攤上這事村生。” “怎么了固惯?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵梆造,是天一觀的道長。 經(jīng)常有香客問我,道長镇辉,這世上最難降的妖魔是什么屡穗? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮忽肛,結(jié)果婚禮上村砂,老公的妹妹穿的比我還像新娘。我一直安慰自己屹逛,他們只是感情好础废,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罕模,像睡著了一般评腺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淑掌,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天蒿讥,我揣著相機與錄音,去河邊找鬼抛腕。 笑死芋绸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的担敌。 我是一名探鬼主播摔敛,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼全封!你這毒婦竟也來了马昙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤售貌,失蹤者是張志新(化名)和其女友劉穎给猾,沒想到半個月后疫萤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颂跨,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年扯饶,在試婚紗的時候發(fā)現(xiàn)自己被綠了恒削。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡尾序,死狀恐怖钓丰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情每币,我是刑警寧澤携丁,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響梦鉴,放射性物質(zhì)發(fā)生泄漏李茫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一肥橙、第九天 我趴在偏房一處隱蔽的房頂上張望魄宏。 院中可真熱鬧,春花似錦存筏、人聲如沸宠互。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽予跌。三九已至,卻和暖如春善茎,著一層夾襖步出監(jiān)牢的瞬間匕得,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工巾表, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汁掠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓集币,卻偏偏與公主長得像考阱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鞠苟,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,104評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,393評論 8 265
  • #臉紅的思春期# 是今年四月份在韓國新出道的女聲二重唱組合乞榨。由容易臉紅的rapper兼吉他手禹智潤和經(jīng)常會有思春期...
    Cyanyyy閱讀 1,341評論 6 5
  • 很早就想把自己拍下的花兒畫下來,可是一直未能成行当娱。最近終于拿起筆涂抹了一番吃既,雖然依然稚嫩,起碼我開始了前行的步伐跨细!...
    葉聽雨閱讀 653評論 13 5
  • 這個故事的靈感來自于前些天翻看瀘沽湖的一張舊照片鹦倚,拍攝于一個叫做彼岸的臨湖客棧,景色絕美冀惭。 故事中的主人公葉小麥震叙,...
    曾經(jīng)的卡卡閱讀 282評論 0 0