国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python基礎教程:類

fish / 2053人閱讀

摘要:類對象被創建時存在于類命名空間內的所有名稱都是有效的屬性名稱。類的實例化,是使用函數表示法,可以把類對象看做是會返回一個新的類實例的函數。這就是可變對象作為類變量時的特性。類變量是所有類的實例共享的屬性和方法,實例變量是每個實例獨有的數據。

Python是面向對象的高級編程語言,在Python里面“一切都是對象”:數字、字符串、元組、列表、字典、集合等內置數據類型,以及函數、方法、類、模塊都是對象。

語言本身提供了上述的基本對象,但在實際編程中,我們要創造各種各樣的對象,Python就為我們提供了創造我們自己的對象的方法:

類(Class),就是組合數據和功能的方法,它讓我們創建一個新類型的對象,并可以創建該類型的新實例。類組合的數據,就是保存自己狀態的屬性,而它組合的功能(函數)就是改變自己狀態的(定義在類中的)方法。類內部定義的函數,稱為類的方法

Python中的類和其它語言(比如C++)有很多相似的特征但也有些區別。如果你已了解其它語言的類的概念,可以在學習Python類時做一定的對比進行學習;如果你沒有學過其它語言也不要緊,學過之后你會發現,類的概念是如此簡單。

類的定義

類的定義是通過關鍵字class實現的,下面是最簡單的類的定義的樣子:

class ClassName:
    語句1
    ...
    語句n

是不是這個形式跟函數的定義(def 語句)很像。因為類是數據和功能的組合,所以語句1可能是內部變量(數據)的定義和賦值語句,也可能是內部方法(函數)的定義語句。類內部的函數定義通常具有一種特別形式的參數列表,這是方法調用的約定規范里面指明的。這個特別形式就是第一個參數必須是self,后面將詳細介紹。

進入類定義時,就會創建一個新的命名空間,并把它用作局部作用域。因此,所有對局部變量的賦值都是在這個新命名空間內進行的。特別的,函數定義會綁定到這個局部作用域里的新函數名稱。

正常離開(從結尾出)類定義時,就會創建一個類對象。它基本上是一個包圍在類定義所創建的命名空間內容周圍的包裝器。元素的(在進入類定義之前起作用的)局部作用域將重新生效,類對象將在這里被綁定到類定義頭給出的類名稱(在上面的例子中就是ClassName)。

類對象

類對象(比如上面例子的ClassName)支持兩種操作:屬性引用實例化

屬性引用的語法跟Python中所有屬性引用的方法一樣:obj.name。類對象被創建時存在于類命名空間內的所有名稱都是有效的屬性名稱。下面是一個包含數據和方法的簡單的類定義:

class YuanRenXue:
    """A demo of class"""
    name = "猿人學"
    def say_hi(self):
        print("Hello world!")

對這個類的有效的屬性引用就是:YuanRenXue.nameYuanRenXue.say_hi,它們分別返回一個字符串和一個函數對象。

類屬性也可以被賦值,因此可以通過賦值來更改Yuanrenxue.name的值。

類的__doc__也是一個有效的屬性,對他的引用會返回所屬類的文檔字符串:"A demo of class"

類的實例化,是使用函數表示法,可以把類對象看做是會返回一個新的類實例的函數。比如上面類對象的實例化就是:

yrx = YuanRenXue()

這就創建了一個類的新實例并將詞對象分配給局部變量yrx

實例化操作可以看成是“調用”類對象。但我們在創建類實例時都想要做些初始化操作,為此類定義時可以定義一個名為__init__()的特殊方法。它是類實例化的初始化方法,跟C++語言中 的構造函數類似。

def __init__(self):
    self.data = None

定義了__init__()方法后,類的實例化操作會自動調用該方法。

當然,__init__()方法也可以有額外(除self之外)的參數以實現更靈活的初始化操作。類對象實例化時(“調用”類對象)傳遞的參數會被傳遞給__init__()方法。例如:

In [27]: class Point: 
    ...:     def __init__(self, x, y): 
    ...:         self.x = x 
    ...:         self.y = y 
    ...:

In [28]: p = Point(7, 8)

In [29]: p.x, p.y
Out[29]: (7, 8)
實例對象

類實例化后我們就得到了實例對象,對它的操作就是:屬性引用。這里的有效屬性名稱是數據屬性和方法。
o

數據屬性,對應C++中的“數據成員”,不懂C++也沒關系,“數據成員”這名字字面上就很形象。數據屬性不需要聲明,它像普通變量一樣,在第一次賦值時產生。比如p是聲明創建的Point的實例,則以下代碼會打印數值8

p.times = 1
while p.times < 5:
    p.times = p.times * 2
print(p.times)
del p.times

雖然p.times并沒有在類定義時聲明(數據屬性不需要聲明),但在任何時候,我們可以給實例賦值一個新的數據屬性(這里是p.times),并可以隨時刪除實例的數據屬性(del p.times)。

方法,是“從屬于”對象的函數。方法這個術語并不是類實例獨有的,其它對象也可以有方法。比如,列表對象有append(), insert(), sort()等方法。

實例對象的有效方法名稱依賴于其所屬的類。 根據定義,一個類中所有是函數對象的屬性都是定義了其實例的相應方法。 因此在我們的示例中,yrx.say_hi是有效的方法引用,因為YuanRenXue.say_hi是一個函數;而yrx.name不是方法,因為YuanRenXue.name不是一個函數。這里要注意,yrx.say_hiYuanRenXue.say_hi并不是一回事,它是一個方法對象,不是函數對象,通俗講,前者是實例的方法,后者是類的函數。

方法對象

通常,調用方法的方法是:

yrx.say_hi()

在YuanRenXue 示例中,這將打印字符串Hello World。但是,調用一個方法也可以換另外一種形式,把它賦值給一個變量后再調用。例如:

yrx_say = yrx.say_hi
yrx_say()

當我們調用yrx.say_hi()時并沒有帶參數,但say_hi()函數定義時指定了一個參數。實際上,方法的特殊之處就是實例對象會作為函數的第一個參數(self)被傳入。調用yrx.say_hi()其實就相當于YuanRenXue.say_hi(yrx)

類變量和實例變量

一般來說,類變量用于類的所有實例共享的屬性和方法,而實例變量用于每個實例的唯一數據:

In [33]: class Tiger: 
    ...:     kind = "feline" 
    ...:     def __init__(self, name)                                         
  File "", line 3
    def __init__(self, name)
                            ^
SyntaxError: invalid syntax

In [34]: class Tiger: 
    ...:     kind = "feline" 
    ...:     def __init__(self, name): 
    ...:         self.name = name 
    ...:

In [35]: a = Tiger("Kiro")

In [36]: b = Tiger("Zim")

In [37]: a.kind
Out[37]: "feline"

In [38]: b.kind
Out[38]: "feline"

In [39]: a.name
Out[39]: "Kiro"

In [40]: b.name
Out[40]: "Zim"

如果類變量是列表或字典這種可變對象會導致令人驚訝的結果,我們要明白這種結果,從而可以在需要的時候利用這個特性,也可以在不需要的時候避免這個特性。是取是舍,全在于我們在編程時要定義的類的作用。下面,我們看看這個“令人驚訝”的結果是什么:

In [42]: class Tiger: 
    ...:     places = [] 
    ...:     def __init__(self, name): 
    ...:         self.name = name 
    ...:     def go_place(self, place): 
    ...:         self.places.append(place) 
    ...:

In [43]: a = Tiger("Kiro")

In [44]: b = Tiger("Zim")

In [45]: a.go_place("北京")

In [46]: b.go_place("上海")

In [47]: a.places
Out[47]: ["北京", "上海"]

這里,把places定義為類變量,它就記錄了所有老虎(Kiro和Zim,以及后面實例化出來個各個老虎)去過的地方,所以,盡管a只去過北京,但是當我們通過a查看places,也看到了上海。這就是可變對象作為類變量時的特性。如果我們就是想記錄所有老虎實例對象去過的地方,這樣的用法就是恰到好處。

如果,我們只想記錄每一只老虎去過的地方,那么就應該把places定義為實例變量,也就是在__init__()中進行初始化賦值。

需要注意的地方

(1)數據屬性會覆蓋掉具有相同名稱的方法屬性,因此寫程序時為了避免名稱沖突,可以使用某些規范來減少沖突,比如:

方法名稱使用大寫字母;

屬性名稱加上特殊的前綴(或加一個下劃線);

用動詞來命名方法,用名詞來命名數據屬性。

這些規范稱為“代碼規范”,一個好的代碼規范讓代碼可讀性更高,也更利用團隊合作。有名的Python代碼規范有“PEP 8”,也有Google的Python風格規范。

(2)數據屬性可以被方法以及對象之外的任何用戶(使用該類的人)所引用。也就是說,Python不行C++類那樣有私有成員,Python沒有任何對象能強制隱藏數據。

(3)類對象的用戶應該謹慎使用數據屬性,直接操作數據屬性可能破壞其中的固定變量。但我們可以想一個實例對象添加我們自己的數據屬性,但要避免與原有的名稱沖突。

(4)方法的第一個參數常常被命名為self,代表實例對象。但這只是大家普通認同的一個約定。你可以用任何單詞來替代它,但是你的代碼讓氣體程序員讀起來就很費勁,也會對VS Code這樣的編輯器造成困惑。

總結

類是組合數據和功能的方法,其中:

數據,是類的屬性,從屬于類的各種數據對象;

功能,是類的方法,定義在類內部的各種函數。

定義好一個類我們就創建了一個類對象,類對象支持兩種操作:屬性引用和實例化。

類對象實例化后就得到了實例對象,它有兩種屬性名稱:數據屬性和方法。

類變量是所有類的實例共享的屬性和方法,實例變量是每個實例獨有的數據。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43844.html

相關文章

  • python基礎教程的繼承

    摘要:類的繼承,說明了不同類直接的關系,派生類復用了基類的代碼同時也繼承了基類的屬性和方法。派生類的實例化會創建該類的一個新實例。派生類既可以單獨繼承一個基類,也可以多重繼承多個基類。 面向對象語言的一個特性就是類的繼承。繼承的關系跟人類繁衍的關系相似,被繼承的類稱為基類(也叫做父類),繼承而得的類叫派生類(也叫子類),這種關系就像人類的父子關系。 showImg(https://segme...

    XFLY 評論0 收藏0
  • python基礎教程:錯誤處理和異常處理(二)

    摘要:語句就是幫助我們拋出知道異常的,比如的使用很簡單,它的語法如下如果它后面不帶表達式參數,它會重新引發當前作用域內最后一個激活的異常。,用于異常的串聯。自定義的異常類的名稱通常以錯誤結尾,類似與內置標準異常的命名。 前面我們講到的Python編程過程中,在可能出現異常的地方使用嘗試語句,來正確的處理一些異常,可以保證程序不中斷繼續運行。 showImg(https://segmentfa...

    wujl596 評論0 收藏0
  • Python爬蟲學習路線

    摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...

    liaoyg8023 評論0 收藏0
  • SegmentFault 技術周刊 Vol.30 - 學習 Python 來做一些神奇好玩的事情吧

    摘要:學習筆記七數學形態學關注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學習筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現代方法基于區域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...

    lifesimple 評論0 收藏0

發表評論

0條評論

fish

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<