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

關(guān)于Python面向?qū)ο缶幊痰闹R點(diǎn)總結(jié)

 更新時間:2017年02月14日 14:56:27   作者:Huoty  
Python從設(shè)計之初就已經(jīng)是一門面向?qū)ο蟮恼Z言,正因為如此,在Python中創(chuàng)建一個類和對象是很容易的。下面這篇文章將詳細(xì)給大家介紹關(guān)于Python面向?qū)ο缶幊痰闹R點(diǎn),需要的朋友可以參考借鑒,下面來一起看看吧。

前言

如果你以前沒有接觸過面向?qū)ο蟮木幊陶Z言,那你可能需要先了解一些面向?qū)ο笳Z言的一些基本特征,在頭腦里頭形成一個基本的面向?qū)ο蟮母拍睿@樣有助于你更容易的學(xué)習(xí)Python的面向?qū)ο缶幊獭?/p>

接下來我們就來了解關(guān)于Python面向?qū)ο缶幊痰闹R點(diǎn)吧。

類與實(shí)例

類是對象的定義,而實(shí)例是"真正的實(shí)物",它存放了類中所定義的對象的具體信息。

類、屬性和方法命名規(guī)范

類名通常由大寫字母打頭。這是標(biāo)準(zhǔn)慣例,可以幫助你識別類,特別是在實(shí)例化過程中(有時看起來像函數(shù)調(diào)用)。還有,數(shù)據(jù)屬性(變量或常量)聽起來應(yīng)當(dāng)是數(shù)據(jù)值的名字,方法名應(yīng)當(dāng)指出對應(yīng)對象或值的行為。

另一種表達(dá)方式是:數(shù)據(jù)值應(yīng)該使用名詞作為名字,方法使用謂詞(動詞加對象)。數(shù)據(jù)項是操作的對象、方法應(yīng)當(dāng)表明程序員想要在對象進(jìn)行什么操作。

在定義的類中,大致遵循這樣的方針,數(shù)據(jù)值像 “name”, “phone” 和 “email”,行為如 “updatePhone”,“updateEmail”。這就是常說的 “混合記法(mixedCase)” 或 “駱駝記法(camelCase)”。Python 規(guī)范推薦使用駱駝記法的下劃線方式,比如, “update_phone”,“update_email”。類也要細(xì)致命名,像 “AddrBookEntry”, “RepairShop” 等等就是很好的名字。

class AddrBookEntry(object):

 def __init__(self, name, phone, email):
 self.name = name
 self.phone = phone
 self.email = email

 def update_phone(self, phone):
 self.phone = phone

 def update_email(self. email):
 self.email = email

新式類與舊式類

新式類和經(jīng)典類聲明的最大不同在于,所有新式類必須繼承至少一個父類。如果沒有可繼承的類,則可繼承 object 類。object 是“所有類之母” ,它位于所有類繼承結(jié)構(gòu)的最上層。如果沒有直接或間接的子類化一個對象,那么就定義了一個經(jīng)典類。即如果沒有指定一個父類,或者如果所子類化的基本類沒有父類,這樣就是創(chuàng)建了一個經(jīng)典類。

在 Python3 中定義的類,默認(rèn)就是新式類,而在 Python2 中要定義一個新式類則必須繼承 object 或者繼承一個新式類。

self 變量

類的方法與普通的函數(shù)只有一個特別的區(qū)別,即它們必須有一個額外的第一個參數(shù)名稱,但是在調(diào)用這個方法的時候你不必為這個參數(shù)賦值,Python 會提供這個值。這個特別的變量指對象本身,按照慣例它的名稱是 self。雖然可以給這個參數(shù)任何名稱,但是強(qiáng)烈建議使用 self 這個名稱,其他名稱都是不贊成使用的。

__init__() 方法

__init__() 類似于類構(gòu)造器,但實(shí)際上并不是一個構(gòu)造器。Python 創(chuàng)建實(shí)例后,在實(shí)例化過程中,調(diào)用 __init__() 方法,當(dāng)一個類被實(shí)例化時,就可以定義額外的行為,比如,設(shè)定初始值或者運(yùn)行一些初步診斷代碼,這主要是在實(shí)例被創(chuàng)建后,實(shí)例化調(diào)用返回這個實(shí)例之前,去執(zhí)行某些特定的任務(wù)或設(shè)置。

綁定及非綁定方法

在 Python 中,訪問類的方法可以通過實(shí)例也可以通過類來直接訪問。但是 Python 嚴(yán)格要求,沒有實(shí)例,方法是不能被調(diào)用的。這種限制即 Python 所描述的綁定概念(binding),在此,方法必須綁定(到一個實(shí)例)才能直接被調(diào)用。非綁定的方法可能可以被調(diào)用,但實(shí)例對象一定要明確給出,才能確保調(diào)用成功。然而,不管是否綁定,方法都是它所在的類的固有屬性,即使它們幾乎總是通過實(shí)例來調(diào)用的。在 Python 中的類方法也是一種對象??梢院唵蔚睦斫饩褪?,通過類直接訪問的方法稱為“未綁定的方法”,而通過實(shí)例訪問的方法稱為“綁定的方法”:

1. 未綁定的類方法:沒有 self

通過類來引用方法返回一個未綁定方法對象。要調(diào)用它,你必須顯示地提供一個實(shí)例作為第一個參數(shù)。

2. 綁定的實(shí)例方法:有 self

通過實(shí)例訪問方法返回一個綁定的方法對象。Python 自動地給方法綁定一個實(shí)例,所以我們調(diào)用它時不用再傳一個實(shí)例參數(shù)。

示例:

class Test:
 def func(self, message):
 print message

object1 = Test()
x = object1.func
x("綁定方法對象,實(shí)例是隱藏的")

t = Test.func
t(object1, "未綁定方法對象,需要傳遞一個實(shí)例")
# t("未綁定方法對象,需要傳遞一個實(shí)例") # 錯誤的調(diào)用

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

類屬性僅是與類相關(guān)的數(shù)據(jù)值,和實(shí)例屬性不同,類屬性和實(shí)例無關(guān)。這些值像靜態(tài)成員那樣被引用,即使在多次實(shí)例化中調(diào)用類,它們的值都保持不變。不管如何,靜態(tài)成員不會因為實(shí)例而改變它們的值,除非實(shí)例中顯式改變它們的值。 實(shí)例屬性與類屬性的比較,類似于自動變量和靜態(tài)變量,但這只是籠統(tǒng)的類推。在你對自動變量和靜態(tài)變量還不是很熟的情況下,不要深究這些。

類和實(shí)例都是名字空間。類是類屬性的名字空間,實(shí)例則是實(shí)例屬性的。

可采用類來訪問類屬性,如果實(shí)例沒有同名的屬性的話,也可以用實(shí)例來訪問。

私有化

Python并不直接支持私有方式,而要靠程序員自己把握在外部進(jìn)行特性修改的時機(jī)。

為了讓方法或者特性變?yōu)樗接校◤耐獠繜o法訪問),只要在它的名字前面加上雙下劃線即可。由雙下劃線 __ 開始的屬性在運(yùn)行時被“混淆”,所以直接訪問是不允許的。

實(shí)際上,在 Python 帶有雙下劃線的屬性或方法并非正真意義上的私有,它們?nèi)匀豢梢员辉L問。在類的內(nèi)部定義中,所有以雙下劃線開始的名字都被“翻譯”成前面加上單下劃線和類名的形式:

>>> class TestObj(object):
... __war = "world"
... 
... def __init__(self):
...  self.__har = "hello"
...  
... def __foo(self):
...  print(self.__har + self.__war)
...  
... 
... 
>>> t = TestObj()
>>> dir(t)
['_TestObj__foo', '_TestObj__har', '_TestObj__war', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getat
tribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__
', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> t.__war
Traceback (most recent call last):
 File "<input>", line 1, in <module>
 t.__war
AttributeError: 'TestObj' object has no attribute '__war'
>>> t.__har
Traceback (most recent call last):
 File "<input>", line 1, in <module>
 t.__har
AttributeError: 'TestObj' object has no attribute '__har'
>>> t.foo()
Traceback (most recent call last):
 File "<input>", line 1, in <module>
 t.foo()
AttributeError: 'TestObj' object has no attribute 'foo'
>>> t._TestObj__war
'world'
>>> t._TestObj__har
'hello'
>>> t._TestObj__foo()
helloworld

__slots__ 類屬性

正常情況下,當(dāng)我們定義了一個 class,創(chuàng)建了一個 class 的實(shí)例后,我們可以給該實(shí)例綁定任何屬性和方法,這就是動態(tài)語言的靈活性。在 Python 中默認(rèn)用字典來存儲實(shí)例的屬性。

示例:

>>> class A():
... pass
... 
>>> a = A()
>>> a.name = "huoty"
>>> a.age = 25
>>> print a.name
huoty
>>> print a.age
25
>>> a.__dict__
{'age': 25, 'name': 'huoty'}

字典位于實(shí)例的“心臟” 。 __dict__屬性跟蹤所有實(shí)例屬性。舉例來說,你有一個實(shí)例 inst,它有一個屬性 foo,那使用 inst.foo 來訪問它與使用 inst.__dict__['foo'] 來訪問是一致的。

字典會占據(jù)大量內(nèi)存,如果你有一個屬性數(shù)量很少的類,但有很多實(shí)例,那么正好是這種情況。為內(nèi)存上的考慮,可以使用 __slots__ 屬性來替代 __dict__

, __slots__ 是新式類的特性?;旧?, __slots__ 是一個類變量,由一序列對象組成,由所有合法標(biāo)識構(gòu)成的實(shí)例屬性的集合來表示。它可以是一個列表,元組或可迭代對象。也可以是標(biāo)識實(shí)例能擁有的唯一的屬性的簡單字符串。任何試圖創(chuàng)建一個其名不在 __slots__ 中的名字的實(shí)例屬性都將導(dǎo)致 AttributeError 異常:

>>> class SlotedClass(object):
... __slots__ = ("foo", "bar")
... 
... 
>>> c = SlotedClass()
>>> c.foo = 42
>>> c.bar = "hello"
>>> c.goo = "don't think so"
Traceback (most recent call last):
 File "&lt;input>", line 1, in &lt;module>
AttributeError: 'SlotedClass' object has no attribute 'goo'

這種特性的主要目的是節(jié)約內(nèi)存。其副作用是某種類型的"安全",它能防止用戶隨心所欲的動態(tài)增加實(shí)例屬性。帶 __slots__ 屬性的類定義不會存在 __dict__ 了(除非你在 __slots__ 中增加 __dict__ 元素)。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • 淺析Python中壓縮zipfile與解壓縮tarfile模塊的使用

    淺析Python中壓縮zipfile與解壓縮tarfile模塊的使用

    Python?提供了兩個標(biāo)準(zhǔn)庫模塊來處理文件的壓縮和解壓縮操作:zipfile和tarfile,本文將分享?這兩個模塊的使用方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Python向excel中寫入數(shù)據(jù)的方法

    Python向excel中寫入數(shù)據(jù)的方法

    這篇文章主要介紹了Python向excel中寫入數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 關(guān)于Keras模型可視化教程及關(guān)鍵問題的解決

    關(guān)于Keras模型可視化教程及關(guān)鍵問題的解決

    今天小編就為大家分享一篇關(guān)于Keras模型可視化教程及關(guān)鍵問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python之django路由和視圖案例教程

    python之django路由和視圖案例教程

    這篇文章主要介紹了python之django路由和視圖案例教程,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • python數(shù)據(jù)持久存儲 pickle模塊的基本使用方法解析

    python數(shù)據(jù)持久存儲 pickle模塊的基本使用方法解析

    這篇文章主要介紹了python數(shù)據(jù)持久存儲 pickle模塊的基本使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • 解決更新tensorflow后應(yīng)用tensorboard報錯的問題

    解決更新tensorflow后應(yīng)用tensorboard報錯的問題

    這篇文章主要介紹了解決更新tensorflow后應(yīng)用tensorboard報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python簡單幾步獲取各種DOS命令顯示的內(nèi)容詳解流程

    python簡單幾步獲取各種DOS命令顯示的內(nèi)容詳解流程

    你會用python獲取各種DOS命令顯示的內(nèi)容核心嗎?說的可不是返回值,是用system()函數(shù)調(diào)用windows操作系統(tǒng)的DOS命令來做點(diǎn)事情,需要的朋友可以參考下
    2021-10-10
  • python tkinter的消息框模塊(messagebox,simpledialog)

    python tkinter的消息框模塊(messagebox,simpledialog)

    這篇文章主要介紹了python tkinter的消息框模塊,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • python類定義的講解

    python類定義的講解

    python是怎么定義類的,看了下面的文章大家就會了,不用多說,開始學(xué)習(xí)。
    2013-11-11
  • Python3學(xué)習(xí)筆記之列表方法示例詳解

    Python3學(xué)習(xí)筆記之列表方法示例詳解

    Python3 列表 序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于Python3學(xué)習(xí)筆記之列表方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下。
    2017-10-10

最新評論