網站首頁 編程語言 正文
Python 面向對象
方法沒有重載#
在其他語言中,可以定義多個重名的方法,只要保證方法簽名唯一即可。方法簽名包含3個部分:方法名、參數數量、參數類型。
Python 中,方法的的參數沒有聲明類型(調用時確定參數的類型),參數的數量也可以由
可變參數控制。因此,Python 中是沒有方法的重載的。定義一個方法即可有多種調用方式,相當于實現了其他語言中的方法的重載。
如果我們在類體中定義了多個重名的方法,只有最后一個方法有效。
建議:不要使用重名的方法!Python 中方法沒有重載。
#Python 中沒有方法的重載。定義多個同名方法,只有最后一個有效
class Person:
def say_hi(self):
print("hello")
def say_hi(self,name):
print("{0},hello".format(name))
p1 = Person()
#p1.say_hi() #不帶參,報錯:TypeError: say_hi() missing 1 required positional argument: 'name'
p1.say_hi("陳浩")
方法的動態性#
Python 是動態語言,我們可以動態的為類添加新的方法,或者動態的修改類的已有的方法。
#測試方法的動態性
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 動態的新增了 play_game 方法,以及用 work2 替換了 work 方法。
私有屬性和私有方法(實現封裝)#
Python 對于類的成員沒有嚴格的訪問控制限制,這與其他面向對象語言有區別。關于私有屬性和私有方法,有如下要點:
- 通常我們約定,兩個下劃線("__")開頭的屬性是私有的(private)。其他為公共的(public)。
- 類內部可以訪問私有屬性(方法)
- 類外部不能直接訪問私有屬性(方法)
- 類外部可以通過“_類名__私有屬性(方法)名”訪問私有屬性(方法)
【注】方法本質上也是屬性!只不過是可以通過()執行而已。所以,此處講的私有屬性和公有屬性,也同時講解了私有方法和公有方法的用法。如下測試中,同時也包含了私有方法和公有方法的例子。
【測試】私有屬性和公有屬性使用測試
#測試私有屬性、私有方法
class Employee:
__company = "Danone" #私有類屬性. 通過 dir 可以查到_Employee__company
def __init__(self, name, age):
self.name = name
self.__age = age #私有實例屬性
def say_company(self):
print("我的公司是:",Employee.__company) #類內部可以直接訪問私有屬性
print(self.name,"的年齡是:",self.__age)
def __work(self): #私有實例方法 通過 dir 可以查到_Employee__work
return "工作!好好工作,好好賺錢,娶個媳婦!"
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())
# 工作!好好工作,好好賺錢,娶個媳婦!
#print(p1.__age) #直接訪問私有屬性,報錯
#print(p1.__work()) #直接訪問私有方法,報錯
@property 裝飾器
@property 可以將一個方法的調用方式變成“屬性調用”
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}當前的薪資是{1}".format(emp.name,emp.salary))
# 陳浩當前的薪資是6000
print("*"*12, "加薪啦", "*"*12)
emp.salary = 10000
print("{0}當前的薪資是{1}".format(emp.name,emp.salary))
# 陳浩當前的薪資是10000
print("*"*12, "離職了", "*"*12)
del emp.salary
print("{0}當前的薪資是{1}".format(emp.name,emp.salary))
# 陳浩當前的薪資是0
@property 主要用于幫助我們處理屬性的讀操作、寫操作。對于某一個屬性,我們可以直接通過類名.方法名 = 值,進行賦值操作。
屬性和方法命名總結#
- _xxx:保護成員,不能用“from module import * ”導入,只有類對象和子類對象能訪問這些成員。
- __xxx__:系統定義的特殊成員
- __xxx: 類中的私有成員,只有類對象自己能訪問,子類對象也不能訪問。(但,在類外部可以通過“對象名. _類名__xxx”這種特殊方式訪問。Python 不存在嚴格意義的私有成員)
注:再次強調,方法和屬性都遵循上面的規則
原文鏈接:https://www.cnblogs.com/thankcat/p/17013616.html
相關推薦
- 2022-09-16 Go語言入門學習之Channel通道詳解_Golang
- 2022-07-01 Python自動操作Excel文件的方法詳解_python
- 2024-07-18 Spring Security之基于HttpRequest配置權限
- 2022-07-19 Linux:配置本地yum源倉庫
- 2022-12-08 C語言如何實現成績等級判別_C 語言
- 2022-09-03 .NET使用System.Timers.Timer類實現程序定時執行_實用技巧
- 2022-06-17 android實現可上下回彈的scrollview_Android
- 2022-07-26 Python+Seaborn繪制分布圖的示例詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支