Python?面向?qū)ο缶幊淘斀?/h1>
更新時(shí)間:2022年12月30日 08:41:09 作者:Hovey
這篇文章主要介紹了Python?面向?qū)ο缶幊淘斀獾南嚓P(guān)資料,需要的朋友可以參考下
Python 面向?qū)ο?/h2>
方法沒有重載#
在其他語(yǔ)言中,可以定義多個(gè)重名的方法,只要保證方法簽名唯一即可。方法簽名包含3個(gè)部分:方法名、參數(shù)數(shù)量、參數(shù)類型。
Python 中,方法的的參數(shù)沒有聲明類型(調(diào)用時(shí)確定參數(shù)的類型),參數(shù)的數(shù)量也可以由
可變參數(shù)控制。因此,Python 中是沒有方法的重載的。定義一個(gè)方法即可有多種調(diào)用方式,相當(dāng)于實(shí)現(xiàn)了其他語(yǔ)言中的方法的重載。
如果我們?cè)陬愺w中定義了多個(gè)重名的方法,只有最后一個(gè)方法有效。
建議:不要使用重名的方法!Python 中方法沒有重載。
#Python 中沒有方法的重載。定義多個(gè)同名方法,只有最后一個(gè)有效
class Person:
def say_hi(self):
print("hello")
def say_hi(self,name):
print("{0},hello".format(name))
p1 = Person()
#p1.say_hi() #不帶參,報(bào)錯(cuò):TypeError: say_hi() missing 1 required positional argument: 'name'
p1.say_hi("陳浩")
方法的動(dòng)態(tài)性#
Python 是動(dòng)態(tài)語(yǔ)言,我們可以動(dòng)態(tài)的為類添加新的方法,或者動(dòng)態(tài)的修改類的已有的方法。
#測(cè)試方法的動(dòng)態(tài)性
class Person:
def work(self):
print("努力上班!")
def play_game(self):
print("玩游戲")
def work2(self):
print("好好工作,努力上班!")
Person.play = play_game
Person.work = work2
p = Person()
p.play() # 玩游戲
p.work() # 好好工作,努力上班!
我們可以看到,Person 動(dòng)態(tài)的新增了 play_game 方法,以及用 work2 替換了 work 方法。
私有屬性和私有方法(實(shí)現(xiàn)封裝)#
Python 對(duì)于類的成員沒有嚴(yán)格的訪問控制限制,這與其他面向?qū)ο笳Z(yǔ)言有區(qū)別。關(guān)于私有屬性和私有方法,有如下要點(diǎn):
- 通常我們約定,兩個(gè)下劃線("__")開頭的屬性是私有的(private)。其他為公共的(public)。
- 類內(nèi)部可以訪問私有屬性(方法)
- 類外部不能直接訪問私有屬性(方法)
- 類外部可以通過“_類名__私有屬性(方法)名”訪問私有屬性(方法)
【注】方法本質(zhì)上也是屬性!只不過是可以通過()執(zhí)行而已。所以,此處講的私有屬性和公有屬性,也同時(shí)講解了私有方法和公有方法的用法。如下測(cè)試中,同時(shí)也包含了私有方法和公有方法的例子。
【測(cè)試】私有屬性和公有屬性使用測(cè)試
#測(cè)試私有屬性、私有方法
class Employee:
__company = "Danone" #私有類屬性. 通過 dir 可以查到_Employee__company
def __init__(self, name, age):
self.name = name
self.__age = age #私有實(shí)例屬性
def say_company(self):
print("我的公司是:",Employee.__company) #類內(nèi)部可以直接訪問私有屬性
print(self.name,"的年齡是:",self.__age)
def __work(self): #私有實(shí)例方法 通過 dir 可以查到_Employee__work
return "工作!好好工作,好好賺錢,娶個(gè)媳婦!"
p1 = Employee("陳浩",18)
print(p1.name)
# 陳浩
print(dir(p1))
# ['_Employee__age', '_Employee__company', '_Employee__work', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_company']
p1.say_company()
# 我的公司是: Danone
# 陳浩 的年齡是: 18
print(p1._Employee__age) #通過這種方式可以直接訪問到私有屬性 。通過 dir 可以查到屬性:_Employee__age
# 18
print(p1._Employee__work())
# 工作!好好工作,好好賺錢,娶個(gè)媳婦!
#print(p1.__age) #直接訪問私有屬性,報(bào)錯(cuò)
#print(p1.__work()) #直接訪問私有方法,報(bào)錯(cuò)
@property 裝飾器
@property 可以將一個(gè)方法的調(diào)用方式變成“屬性調(diào)用”
class Employee:
def __init__(self, name, salary):
self.name = name
self.__salary = salary
@property #getter方法
def salary(self):
return self.__salary
@salary.setter #setter方法
def salary(self, salary):
self.__salary = salary
@salary.deleter #deleter方法
def salary(self):
self.__salary = 0
emp = Employee("陳浩", 6000)
print("{0}當(dāng)前的薪資是{1}".format(emp.name,emp.salary))
# 陳浩當(dāng)前的薪資是6000
print("*"*12, "加薪啦", "*"*12)
emp.salary = 10000
print("{0}當(dāng)前的薪資是{1}".format(emp.name,emp.salary))
# 陳浩當(dāng)前的薪資是10000
print("*"*12, "離職了", "*"*12)
del emp.salary
print("{0}當(dāng)前的薪資是{1}".format(emp.name,emp.salary))
# 陳浩當(dāng)前的薪資是0
@property 主要用于幫助我們處理屬性的讀操作、寫操作。對(duì)于某一個(gè)屬性,我們可以直接通過類名.方法名 = 值,進(jìn)行賦值操作。
屬性和方法命名總結(jié)#
- _xxx:保護(hù)成員,不能用“from module import * ”導(dǎo)入,只有類對(duì)象和子類對(duì)象能訪問這些成員。
- __xxx__:系統(tǒng)定義的特殊成員
- __xxx: 類中的私有成員,只有類對(duì)象自己能訪問,子類對(duì)象也不能訪問。(但,在類外部可以通過“對(duì)象名. _類名__xxx”這種特殊方式訪問。Python 不存在嚴(yán)格意義的私有成員)
注:再次強(qiáng)調(diào),方法和屬性都遵循上面的規(guī)則
到此這篇關(guān)于Python 面向?qū)ο缶幊淘斀?的文章就介紹到這了,更多相關(guān)Python 面向?qū)ο?內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python入門篇之面向?qū)ο?/a>
- Python面向?qū)ο笾蓄悾╟lass)的簡(jiǎn)單理解與用法分析
- Python面向?qū)ο笾惡蛯?duì)象實(shí)例詳解
- Python 使用 attrs 和 cattrs 實(shí)現(xiàn)面向?qū)ο缶幊痰膶?shí)踐
- Python 面向?qū)ο?成員的訪問約束
- Python面向?qū)ο髮?shí)現(xiàn)一個(gè)對(duì)象調(diào)用另一個(gè)對(duì)象操作示例
- Python3.5面向?qū)ο缶幊虉D文與實(shí)例詳解
- Python中的面向?qū)ο缶幊淘斀?上)
- Python面向?qū)ο箢惖睦^承實(shí)例詳解
相關(guān)文章
-
Python open讀寫文件實(shí)現(xiàn)腳本
Python中文件操作可以通過open函數(shù),這的確很像C語(yǔ)言中的fopen。通過open函數(shù)獲取一個(gè)file object,然后調(diào)用read(),write()等方法對(duì)文件進(jìn)行讀寫操作。
2008-09-09
-
將pytorch轉(zhuǎn)成longtensor的簡(jiǎn)單方法
今天小編就為大家分享一篇將pytorch轉(zhuǎn)成longtensor的簡(jiǎn)單方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧 2020-02-02
-
python xml.etree.ElementTree遍歷xml所有節(jié)點(diǎn)實(shí)例詳解
這篇文章主要介紹了python xml.etree.ElementTree遍歷xml所有節(jié)點(diǎn)實(shí)例詳解的相關(guān)資料,這里附有實(shí)例代碼,需要的朋友可以參考下 2016-12-12
-
python設(shè)定并獲取socket超時(shí)時(shí)間的方法
今天小編就為大家分享一篇python設(shè)定并獲取socket超時(shí)時(shí)間的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧 2019-01-01
-
python 普通克里金(Kriging)法的實(shí)現(xiàn)
這篇文章主要介紹了python 普通克里金(Kriging)法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧 2019-12-12
最新評(píng)論
Python 面向?qū)ο?/h2>
方法沒有重載#
在其他語(yǔ)言中,可以定義多個(gè)重名的方法,只要保證方法簽名唯一即可。方法簽名包含3個(gè)部分:方法名、參數(shù)數(shù)量、參數(shù)類型。
Python 中,方法的的參數(shù)沒有聲明類型(調(diào)用時(shí)確定參數(shù)的類型),參數(shù)的數(shù)量也可以由
可變參數(shù)控制。因此,Python 中是沒有方法的重載的。定義一個(gè)方法即可有多種調(diào)用方式,相當(dāng)于實(shí)現(xiàn)了其他語(yǔ)言中的方法的重載。
如果我們?cè)陬愺w中定義了多個(gè)重名的方法,只有最后一個(gè)方法有效。
建議:不要使用重名的方法!Python 中方法沒有重載。
#Python 中沒有方法的重載。定義多個(gè)同名方法,只有最后一個(gè)有效 class Person: def say_hi(self): print("hello") def say_hi(self,name): print("{0},hello".format(name)) p1 = Person() #p1.say_hi() #不帶參,報(bào)錯(cuò):TypeError: say_hi() missing 1 required positional argument: 'name' p1.say_hi("陳浩")
方法的動(dòng)態(tài)性#
Python 是動(dòng)態(tài)語(yǔ)言,我們可以動(dòng)態(tài)的為類添加新的方法,或者動(dòng)態(tài)的修改類的已有的方法。
#測(cè)試方法的動(dòng)態(tài)性 class Person: def work(self): print("努力上班!") def play_game(self): print("玩游戲") def work2(self): print("好好工作,努力上班!") Person.play = play_game Person.work = work2 p = Person() p.play() # 玩游戲 p.work() # 好好工作,努力上班!
我們可以看到,Person 動(dòng)態(tài)的新增了 play_game 方法,以及用 work2 替換了 work 方法。
私有屬性和私有方法(實(shí)現(xiàn)封裝)#
Python 對(duì)于類的成員沒有嚴(yán)格的訪問控制限制,這與其他面向?qū)ο笳Z(yǔ)言有區(qū)別。關(guān)于私有屬性和私有方法,有如下要點(diǎn):
- 通常我們約定,兩個(gè)下劃線("__")開頭的屬性是私有的(private)。其他為公共的(public)。
- 類內(nèi)部可以訪問私有屬性(方法)
- 類外部不能直接訪問私有屬性(方法)
- 類外部可以通過“_類名__私有屬性(方法)名”訪問私有屬性(方法)
【注】方法本質(zhì)上也是屬性!只不過是可以通過()執(zhí)行而已。所以,此處講的私有屬性和公有屬性,也同時(shí)講解了私有方法和公有方法的用法。如下測(cè)試中,同時(shí)也包含了私有方法和公有方法的例子。
【測(cè)試】私有屬性和公有屬性使用測(cè)試
#測(cè)試私有屬性、私有方法 class Employee: __company = "Danone" #私有類屬性. 通過 dir 可以查到_Employee__company def __init__(self, name, age): self.name = name self.__age = age #私有實(shí)例屬性 def say_company(self): print("我的公司是:",Employee.__company) #類內(nèi)部可以直接訪問私有屬性 print(self.name,"的年齡是:",self.__age) def __work(self): #私有實(shí)例方法 通過 dir 可以查到_Employee__work return "工作!好好工作,好好賺錢,娶個(gè)媳婦!" p1 = Employee("陳浩",18) print(p1.name) # 陳浩 print(dir(p1)) # ['_Employee__age', '_Employee__company', '_Employee__work', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_company'] p1.say_company() # 我的公司是: Danone # 陳浩 的年齡是: 18 print(p1._Employee__age) #通過這種方式可以直接訪問到私有屬性 。通過 dir 可以查到屬性:_Employee__age # 18 print(p1._Employee__work()) # 工作!好好工作,好好賺錢,娶個(gè)媳婦! #print(p1.__age) #直接訪問私有屬性,報(bào)錯(cuò) #print(p1.__work()) #直接訪問私有方法,報(bào)錯(cuò)
@property 裝飾器
@property 可以將一個(gè)方法的調(diào)用方式變成“屬性調(diào)用”
class Employee: def __init__(self, name, salary): self.name = name self.__salary = salary @property #getter方法 def salary(self): return self.__salary @salary.setter #setter方法 def salary(self, salary): self.__salary = salary @salary.deleter #deleter方法 def salary(self): self.__salary = 0 emp = Employee("陳浩", 6000) print("{0}當(dāng)前的薪資是{1}".format(emp.name,emp.salary)) # 陳浩當(dāng)前的薪資是6000 print("*"*12, "加薪啦", "*"*12) emp.salary = 10000 print("{0}當(dāng)前的薪資是{1}".format(emp.name,emp.salary)) # 陳浩當(dāng)前的薪資是10000 print("*"*12, "離職了", "*"*12) del emp.salary print("{0}當(dāng)前的薪資是{1}".format(emp.name,emp.salary)) # 陳浩當(dāng)前的薪資是0
@property 主要用于幫助我們處理屬性的讀操作、寫操作。對(duì)于某一個(gè)屬性,我們可以直接通過類名.方法名 = 值,進(jìn)行賦值操作。
屬性和方法命名總結(jié)#
- _xxx:保護(hù)成員,不能用“from module import * ”導(dǎo)入,只有類對(duì)象和子類對(duì)象能訪問這些成員。
- __xxx__:系統(tǒng)定義的特殊成員
- __xxx: 類中的私有成員,只有類對(duì)象自己能訪問,子類對(duì)象也不能訪問。(但,在類外部可以通過“對(duì)象名. _類名__xxx”這種特殊方式訪問。Python 不存在嚴(yán)格意義的私有成員)
注:再次強(qiáng)調(diào),方法和屬性都遵循上面的規(guī)則
到此這篇關(guān)于Python 面向?qū)ο缶幊淘斀?的文章就介紹到這了,更多相關(guān)Python 面向?qū)ο?內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python入門篇之面向?qū)ο?/a>
- Python面向?qū)ο笾蓄悾╟lass)的簡(jiǎn)單理解與用法分析
- Python面向?qū)ο笾惡蛯?duì)象實(shí)例詳解
- Python 使用 attrs 和 cattrs 實(shí)現(xiàn)面向?qū)ο缶幊痰膶?shí)踐
- Python 面向?qū)ο?成員的訪問約束
- Python面向?qū)ο髮?shí)現(xiàn)一個(gè)對(duì)象調(diào)用另一個(gè)對(duì)象操作示例
- Python3.5面向?qū)ο缶幊虉D文與實(shí)例詳解
- Python中的面向?qū)ο缶幊淘斀?上)
- Python面向?qū)ο箢惖睦^承實(shí)例詳解
相關(guān)文章
Python open讀寫文件實(shí)現(xiàn)腳本
Python中文件操作可以通過open函數(shù),這的確很像C語(yǔ)言中的fopen。通過open函數(shù)獲取一個(gè)file object,然后調(diào)用read(),write()等方法對(duì)文件進(jìn)行讀寫操作。2008-09-09將pytorch轉(zhuǎn)成longtensor的簡(jiǎn)單方法
今天小編就為大家分享一篇將pytorch轉(zhuǎn)成longtensor的簡(jiǎn)單方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02python xml.etree.ElementTree遍歷xml所有節(jié)點(diǎn)實(shí)例詳解
這篇文章主要介紹了python xml.etree.ElementTree遍歷xml所有節(jié)點(diǎn)實(shí)例詳解的相關(guān)資料,這里附有實(shí)例代碼,需要的朋友可以參考下2016-12-12python設(shè)定并獲取socket超時(shí)時(shí)間的方法
今天小編就為大家分享一篇python設(shè)定并獲取socket超時(shí)時(shí)間的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01python 普通克里金(Kriging)法的實(shí)現(xiàn)
這篇文章主要介紹了python 普通克里金(Kriging)法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12