Python面向?qū)ο蠡A(chǔ)入門之設(shè)置對象屬性
前言
前面我們已經(jīng)介紹了 python面向?qū)ο笕腴T教程之從代碼復(fù)用開始(一) ,這篇文章主要介紹的是關(guān)于Python面向?qū)ο笾O(shè)置對象屬性的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧
用類存儲數(shù)據(jù)
類實(shí)際上就是一個(gè)數(shù)據(jù)結(jié)構(gòu),對于python而言,它是一個(gè)類似于字典的結(jié)構(gòu)。當(dāng)根據(jù)類創(chuàng)建了對象之后,這個(gè)對象就有了一個(gè)數(shù)據(jù)結(jié)構(gòu),包含一些賦值了的屬性。在這一點(diǎn)上,它和其它語言的struct的作用是類似的:存儲數(shù)據(jù)并提供數(shù)據(jù)檢索功能。
例如,下面是史上最簡單的類:
class Person: pass
pass關(guān)鍵字表示這個(gè)類沒有實(shí)際的邏輯體。這里只是定義了一個(gè)類,這個(gè)類的對象初始化時(shí)不會存放任何數(shù)據(jù)。現(xiàn)在,構(gòu)造一個(gè)對象,讓它和dict一樣存放一些數(shù)據(jù):
p = Person() # 構(gòu)造對象 p.name = "longshuai" # 創(chuàng)建對象的屬性name p.age = 23 # 創(chuàng)建對象的屬性age
現(xiàn)在,Person的實(shí)例對象p中就存放了兩個(gè)屬性:p.name和p.age??梢灾苯尤z索存放在p中的數(shù)據(jù):
print(p.name) # 輸出"longshuai" print(p.age) # 輸出23
也可以使用dict來存儲這些數(shù)據(jù):
>>> d={} >>> d["name"]="longshuai" >>> d["age"]=23 >>> print(d["name"]) longshuai >>> print(d["age"]) 23
在數(shù)據(jù)存儲方面,它們的作用是完全等價(jià)的。實(shí)際上對象/類在內(nèi)部就是使用一個(gè)名為__dict__的dict類型來存放它所擁有的數(shù)據(jù)的。
>>> p.__dict__ {'name': 'longshuai', 'age': 23}
__init__()構(gòu)造對象初始數(shù)據(jù)
上面的name和age屬性是在構(gòu)建了對象之后附加上去的,如果想要?jiǎng)?chuàng)建對象時(shí)就存放好數(shù)據(jù),可以定義類的構(gòu)造函數(shù)__init__()。例如:
class Person: def __init__(self,name,age): self.name = name self.age = age
然后創(chuàng)建對象的時(shí)候,傳遞name參數(shù)和age參數(shù)即可。
>>> p = Person("longshuai",23) >>> p.__dict__ {'name': 'longshuai', 'age': 23}
如果想定義這個(gè)類公有的數(shù)據(jù),可以將公有屬性定義為類的屬性。比如中國人都是黃皮膚:
class Person: skin = "yellow" def __init__(self,name,age): self.name = name self.age = age
這樣每次創(chuàng)建Person的對象實(shí)例時(shí),每個(gè)對象都會有相同的膚色:yellow。但注意,這個(gè)skin屬性是類屬性,不是對象屬性,它是存放在類的名稱空間中的。當(dāng)對象真的需要這個(gè)屬性的時(shí)候,會臨時(shí)去檢索類的名稱空間來獲取??聪旅娴腳_dict__字典即可知道:
>>> p = Person("longshuai",23) >>> p.__dict__ {'name': 'longshuai', 'age': 23} >>> p.skin 'yellow'
但注意,按照面向?qū)ο蟮姆庋b原則,在類中定義類變量屬性是不合理的,因?yàn)橐谕獠吭L問它需要通過x.y的方式,這意味著打開了封裝好的"黑匣子",暴露了屬性。除非真的有需要,否則可以將類變量的定義放進(jìn)構(gòu)造函數(shù)__init__()中,這樣每個(gè)初始化的對象都會有該屬性。
setter和getter方法
在面向?qū)ο蟮慕嵌壬峡紤],一般是不建議直接在類的外部通過x.name的方式賦值、取值的。而是定義對應(yīng)的方法,通過方法來取得對應(yīng)的值。這兩類方法稱為setter、getter方法:setter用于賦值或設(shè)置屬性值,getter用于取得屬性值。
class Person: skin = "yellow" def __init__(self,name,age): self.name = name self.age = age def set(self,job): self.job = job return self def get(self): return self.name,self.age,self.job
上面的set方法用于設(shè)置一個(gè)新屬性job。get用于返回對象的3個(gè)屬性。
>>> p = Person("longshuai",23) >>> p.set("manager") >>> name, age, job = p.get() >>> print([name,age,job]) ['longshuai', 23, 'manager']
需要注意,setter方法可以有多種類型的返回值,常用的有4種:
- 返回設(shè)置后的值
- 返回設(shè)置前的值
- 返回對象自身
- 返回布爾值,表示是否設(shè)置成功
這4種返回值都很常見,特別是第三種用來串聯(lián)對象方法的時(shí)候非常好用。修改上面的set方法:
class Person: skin = "yellow" def __init__(self,name,age): self.name = name self.age = age def set(self,job): self.job = job return self def get(self): return self.name,self.age,self.job
上面的set()返回self對象自身。于是串聯(lián)set()和get():
>>> p = Person("longshuai",23) >>> name,age,job = p.set("manager").get()
無論使用何種返回值方式,都不會真正影響程序的使用。但使用合理的返回值類型,可能會簡化代碼的編寫。另外,決定了返回值的方式后,就不要再去修改,因?yàn)楹芸赡軙恳话l(fā)而動全身。
上面的getter返回了多個(gè)值,但一般來說getter只返回一個(gè)對應(yīng)的屬性。比如getname()返回name屬性,getage()返回age屬性等。這樣需要定義多個(gè)getter方法。
def get_name(self): return self.name def get_age(self): return self.age def get_job(self): return self.job
合并setter和getter
很多時(shí)候可以合并setter和getter方法。合并的方式是判斷方法的參數(shù),如果調(diào)用方法的時(shí)候給了參數(shù),就表示setter,沒有給定參數(shù),就表示是getter。
例如,對于job屬性:
def set_get_job(self, job=None): if job: self.job = job else: return self.job
現(xiàn)在可以以給參數(shù)和不給參數(shù)兩種不同的方式來調(diào)用set_get_job()方法:
p = Person("longshuai", 23) p.set_get_job("manager") # 給了參數(shù),說明是setter job = p.set_get_job() # 沒給參數(shù),說明是getter
總結(jié)
本文介紹了各種設(shè)置對象屬性的方式,屬性其實(shí)就是數(shù)據(jù),對象/類就是屬性的容器,這一點(diǎn)很重要。我最開始學(xué)java的面向?qū)ο髸r(shí),雖然對類和對象有那些教科書式的理解,但始終沒有感受到類/對象其實(shí)就是一種用來存儲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。直到學(xué)習(xí)了Python/Perl,我才意識到這一點(diǎn),然后理解面向?qū)ο缶腿菀椎亩嗔恕?/p>
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
編寫Python腳本來獲取Google搜索結(jié)果的示例
這篇文章主要介紹了編寫Python腳本來獲取Google搜索結(jié)果的示例,也是利用Python編寫爬蟲的一個(gè)簡單實(shí)現(xiàn),需要的朋友可以參考下2015-05-05Python 數(shù)據(jù)可視化pyecharts的使用詳解
這篇文章主要介紹了Python 數(shù)據(jù)可視化pyecharts的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06詳解python實(shí)現(xiàn)數(shù)據(jù)歸一化處理的方式:(0,1)標(biāo)準(zhǔn)化
這篇文章主要介紹了詳解python實(shí)現(xiàn)數(shù)據(jù)歸一化處理的方式:(0,1)標(biāo)準(zhǔn)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了
這篇文章主要介紹了分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了一勞永逸,需要的朋友可以參考下2020-12-12