Python 學(xué)習(xí)筆記6 - 面向?qū)ο缶幊?Object Oriented Programming

在Python中命咐,所有數(shù)據(jù)類型都可以視為對象

  • 變量 - 屬性
  • 函數(shù) - 方法

定義自定義對象(通過 class 關(guān)鍵字):

# 自定義的對象數(shù)據(jù)類型就是面向?qū)ο笾械念悾–lass)的概念
# (object) 表示該類是從哪個(gè)類繼承下來的爽冕。通常杖狼,如果沒有合適的繼承類澡屡,就使用object類,這是所有類最終都會(huì)繼承的類
class Student(object):
    # __init__方法的第一個(gè)參數(shù)永遠(yuǎn)是self咐旧,表示創(chuàng)建的實(shí)例本身
    # 有了__init__方法驶鹉,在創(chuàng)建實(shí)例的時(shí)候,就不能傳入空的參數(shù)了铣墨,必須傳入與__init__方法匹配的參數(shù)梁厉,但self不需要傳,Python解釋器自己會(huì)把實(shí)例變量傳進(jìn)去
    def __init__(self, name, score, sex):
        self.name = name
        self.score = score
        在Python中踏兜,實(shí)例的變量名如果以__開頭词顾,就變成了一個(gè)私有變量(private),只有內(nèi)部可以訪問碱妆,外部不能訪問
        self.__sex = sex
    # 和普通的函數(shù)相比肉盹,在類中定義的函數(shù)只有一點(diǎn)不同,就是第一個(gè)參數(shù)永遠(yuǎn)是實(shí)例變量self疹尾,并且上忍,調(diào)用時(shí),不用傳遞該參數(shù)
    def print_score(self):
        print('%s: %s' % (self.name, self.score))
    # 可對 private 變量增加 getter 和 setter 方法
    def get_sex(self):
        return self.__sex
    def set_sex(self, sex):
        self.__sex = sex
# 根據(jù) Student 類創(chuàng)建出 Student 的實(shí)例
bart = Student('Bart Simpson', 59)
# 給對象發(fā)消息實(shí)際上就是調(diào)用對象對應(yīng)的關(guān)聯(lián)函數(shù)纳本,稱之為對象的方法(Method)
# 要調(diào)用一個(gè)方法窍蓝,只需要在實(shí)例變量上直接調(diào)用,除了self不用傳遞繁成,其他參數(shù)正常傳入
bart.print_score()
# 可以自由地給一個(gè)實(shí)例變量綁定屬性
bart.age = 15

繼承和多態(tài)

獲取對象信息

type() —— 判斷對象類型

type()函數(shù)返回對應(yīng)的Class類型

type(123)
type('str')
type(None)

type(abs)

比較兩個(gè)變量的type類型是否相同:

type(123)==type(456)
type(123)==int

判斷一個(gè)對象是否是函數(shù) —— 使用types模塊中定義的常量

import types

def fn():
    pass
    
type(fn)==types.FunctionType ==> True

type(abs)==types.BuiltinFunctionType ==> True

type(lambda x: x)==types.LambdaType ==> True

type((x for x in range(10)))==types.GeneratorType ==> True

isinstance() —— 判斷class的繼承關(guān)系

假設(shè)有繼承關(guān)系:object -> Animal -> Dog -> Husky

a = Animal()
d = Dog()
h = Husky()
isinstance(h, Husky) ==> True
isinstance(h, Dog) ==> True
isinstance(h, Animal) ==> True
isinstance(h, object) ==> True

isinstance(d, Dog) and isinstance(d, Animal) ==> True
isinstance(d, Husky) ==> False

能用type()判斷的基本類型也可以用isinstance()判斷

isinstance('a', str)
isinstance(123, int)

還可以判斷一個(gè)變量是否是某些類型中的一種

# list 或者 tuple
isinstance([1, 2, 3], (list, tuple)) ==> True

dir() —— 獲得對象的所有屬性和方法

dir()函數(shù)吓笙,它返回一個(gè)包含字符串的list

dir('123')

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

僅僅把屬性和方法列出來是不夠的,配合 getattr() 巾腕、 setattr() 以及 hasattr() 面睛,我們可以直接操作一個(gè)對象的狀態(tài):

class MyObject(object):
    def __init__(self):
        self.x = 9
    def power(self):
        return self.x * self.x

obj = MyObject()

屬性:

hasattr(obj, 'x')

hasattr(obj, 'y')

setattr(obj, 'y', 19)

# 試圖獲取不存在的屬性,會(huì)拋出 AttributeError 的錯(cuò)誤
getattr(obj, 'y')

# 可以傳入一個(gè)default參數(shù)尊搬,如果屬性不存在叁鉴,就返回默認(rèn)值
getattr(obj, 'y', 404)

方法:

hasattr(obj, 'power')

getattr(obj, 'power')

fn = getattr(obj, 'power')

# 調(diào)用fn()與調(diào)用obj.power()是一樣的
fn()

實(shí)例屬性和類屬性

類本身綁定一個(gè)屬性

class Student(object):
    # name 屬性雖然歸類 Student 所有,但類的所有實(shí)例都可以訪問到
    name = 'Student'

相同名稱的實(shí)例屬性將屏蔽掉類屬性佛寿,但是當(dāng)刪除實(shí)例屬性后幌墓,再使用相同的名稱,訪問到的將是類屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冀泻,一起剝皮案震驚了整個(gè)濱河市常侣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腔长,老刑警劉巖袭祟,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件验残,死亡現(xiàn)場離奇詭異捞附,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門鸟召,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胆绊,“玉大人,你說我怎么就攤上這事欧募⊙棺矗” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵跟继,是天一觀的道長种冬。 經(jīng)常有香客問我,道長舔糖,這世上最難降的妖魔是什么娱两? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮金吗,結(jié)果婚禮上十兢,老公的妹妹穿的比我還像新娘。我一直安慰自己摇庙,他們只是感情好旱物,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卫袒,像睡著了一般宵呛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夕凝,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天烤蜕,我揣著相機(jī)與錄音,去河邊找鬼迹冤。 笑死讽营,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泡徙。 我是一名探鬼主播橱鹏,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼堪藐!你這毒婦竟也來了莉兰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤礁竞,失蹤者是張志新(化名)和其女友劉穎糖荒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體模捂,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捶朵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年蜘矢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片综看。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡品腹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出红碑,到底是詐尸還是另有隱情舞吭,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布析珊,位于F島的核電站羡鸥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏忠寻。R本人自食惡果不足惜兄春,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锡溯。 院中可真熱鬧赶舆,春花似錦、人聲如沸祭饭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倡蝙。三九已至九串,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寺鸥,已是汗流浹背猪钮。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胆建,地道東北人烤低。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像笆载,于是被迫代替她去往敵國和親扑馁。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

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