欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?面向對象編程詳解

 更新時間:2022年12月30日 08:41:09   作者:Hovey  
這篇文章主要介紹了Python?面向對象編程詳解的相關資料,需要的朋友可以參考下

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("陳浩")

方法的動態(tài)性#

Python 是動態(tài)語言,我們可以動態(tài)的為類添加新的方法,或者動態(tài)的修改類的已有的方法。

#測試方法的動態(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 動態(tài)的新增了 play_game 方法,以及用 work2 替換了 work 方法。

私有屬性和私有方法(實現封裝)#

Python 對于類的成員沒有嚴格的訪問控制限制,這與其他面向對象語言有區(qū)別。關于私有屬性和私有方法,有如下要點:

  • 通常我們約定,兩個下劃線("__")開頭的屬性是私有的(private)。其他為公共的(public)。
  • 類內部可以訪問私有屬性(方法)
  • 類外部不能直接訪問私有屬性(方法)
  • 類外部可以通過“_類名__私有屬性(方法)名”訪問私有屬性(方法)

【注】方法本質上也是屬性!只不過是可以通過()執(zhí)行而已。所以,此處講的私有屬性和公有屬性,也同時講解了私有方法和公有方法的用法。如下測試中,同時也包含了私有方法和公有方法的例子。

【測試】私有屬性和公有屬性使用測試

#測試私有屬性、私有方法
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__:系統(tǒng)定義的特殊成員
  • __xxx: 類中的私有成員,只有類對象自己能訪問,子類對象也不能訪問。(但,在類外部可以通過“對象名. _類名__xxx”這種特殊方式訪問。Python 不存在嚴格意義的私有成員)

注:再次強調,方法和屬性都遵循上面的規(guī)則

到此這篇關于Python 面向對象編程詳解 的文章就介紹到這了,更多相關Python 面向對象 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python如何開啟多線程

    python如何開啟多線程

    這篇文章主要介紹了python如何開啟多線程問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python對csv文件追加寫入列的方法

    python對csv文件追加寫入列的方法

    這篇文章主要介紹了python對csv文件追加寫入列,需要的朋友可以參考下
    2019-08-08
  • Python open讀寫文件實現腳本

    Python open讀寫文件實現腳本

    Python中文件操作可以通過open函數,這的確很像C語言中的fopen。通過open函數獲取一個file object,然后調用read(),write()等方法對文件進行讀寫操作。
    2008-09-09
  • 將pytorch轉成longtensor的簡單方法

    將pytorch轉成longtensor的簡單方法

    今天小編就為大家分享一篇將pytorch轉成longtensor的簡單方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python xml.etree.ElementTree遍歷xml所有節(jié)點實例詳解

    python xml.etree.ElementTree遍歷xml所有節(jié)點實例詳解

    這篇文章主要介紹了python xml.etree.ElementTree遍歷xml所有節(jié)點實例詳解的相關資料,這里附有實例代碼,需要的朋友可以參考下
    2016-12-12
  • 一文詳解python多繼承的3C算法

    一文詳解python多繼承的3C算法

    有很多地方都說python多繼承的繼承順序,是按照深度遍歷的方式,其實python多繼承順序的算法,不是嚴格意義上的深度遍歷,而是基于深度遍歷基礎上優(yōu)化出一種叫3C算法,本文將給大家詳細的介紹一下python多繼承的3C算法,需要的朋友可以參考下
    2024-07-07
  • Python提取網頁中超鏈接的方法

    Python提取網頁中超鏈接的方法

    很多人在一開始學習Python,會打算用作爬蟲開發(fā)。既然要做爬蟲,首先就要抓取網頁,并且從網頁中提取出超鏈接地址。這篇文章給大家分享一個簡單的方法,有需要的可以參考借鑒。
    2016-09-09
  • python設定并獲取socket超時時間的方法

    python設定并獲取socket超時時間的方法

    今天小編就為大家分享一篇python設定并獲取socket超時時間的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python 普通克里金(Kriging)法的實現

    python 普通克里金(Kriging)法的實現

    這篇文章主要介紹了python 普通克里金(Kriging)法的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • python生成日歷實例解析

    python生成日歷實例解析

    這篇文章主要介紹了python生成日歷的方法,實用了python自帶的 calendar模塊加以實現,需要的朋友可以參考下
    2014-08-08

最新評論