国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

python簡單談談“類”

2019-11-14 17:33:37
字體:
來源:轉載
供稿:網友

文章出處:http://m.survivalescaperooms.com/winstic/,請保留此連接

面向對象是python語言的一大特色,而類又是面向對象編程的核心


 

先來一段關于類的聲明:

class myClass(object):            # 繼承object        """It's my first class defined """    # 文檔字符串        version = 1.0                # 靜態成員        testlist = [1, 2, 3]        def __init__(self, nm = "john"):            """constructor"""            self.name = nm        def showname(self):            """display name"""            PRint "your name is: ", self.name        def showversion(self):            """display version"""            print "The version is: ", self.version

 

在類中聲明的靜態變量(也叫類屬性)version、testlist將被所有實例及類的方法show*所共享

在類的定義中又一個很明顯的特點,每個函數都有一個參數self;什么事self呢?我們可以聯想一下C++中的this指針,沒錯她們有類似的功能,在python中self是類實例的引用,請記住是類實例的引用而不是類本身,那么我想引用實際的類怎么辦,當然沒問題,可以使用self.__class__

 


__init__()

  這個函數很特殊,我們知道前后帶有雙下劃線的表示python中的特殊方法,那么他有什么特殊呢,很快可以聯想到構造函數(注意有區別哦)
 
  在類中經常會看到這樣的方法,可以被當成構造函數,但又不同于其他語言的構造函數,它并不創建對象實例 ,僅僅只是對象創建后執行的第一個方法,主要目的是完成一些必要的初始化工作;
      一般都會有一個系統默認的__init__(),什么都不做,
       我們在__init()__方法中定義的變量,但這個變量只在類實例中存在,并不是實際類本身的一部分

 


 

類實例修改屬性值?

  每個類實例只能修改自己的屬性值,可以說在多個類實例中是互不影響的,但這有一個前提:該屬性值必須是不可變對象(為什么?請繼續看...)

  

  雖然可以通過對象改變自己的屬性值,但當您這么做的時候,請擦亮您的火眼金金,看清類屬性是可變還是不可變的類型;當然如果您要改變類屬性時可以使用類名.屬性名 = ××××來實現;下面將簡單分析不可變對象和可變對象在屬性值改變情況下的區別:

>>> # 對不可變對象(number)操作,實例間互不影響>>> test1 = myClass()>>> test2 = myClass()>>> test1.version = 2.0>>> test1.showversion()The version is:  2.0>>> test2.showversion()The version is:  1.0
>>> # 對可變對象(list)操作時,實例間同步更新>>> test1.testlist[0] = 10>>> test1.testlist[10, 2, 3]>>> test2.testlist[10, 2, 3]
  • 原因分析:

    當改變類屬性時,如果屬性是immutable的,該屬性會被復制出一個副本,存放在當前對象__dict__中;而原始類本身對應的值并沒有改變。

>>> test1.__dict__{'version': 2.0, 'name': 'john'}>>> test1.__class__.version1.0>>> test1.__class__.__dict__dict_proxy({'__module__': '__main__', 'version': 1.0, '__init__': <function __init__ at 0x025FFAB0>, '__dict__': <attribute '__dict__' of 'myClass' objects>, '__weakref__': <attribute '__weakref__' of 'myClass' objects>, 'showversion': <function showversion at 0x025FFB30>, 'testlist': [10, 2, 3], '__doc__': "It's my first class defined ", 'showname': <function showname at 0x025FFAF0>})

 

    而如果類屬性值是可變的(mutable),因為還是在原內存地址中操作,并沒有產生相應的副本,同時該值一旦改變會直接更改原始類中的對應屬性值,進而影響其  他對類實例

>>> test1.testlist[10, 2, 3]>>> test1.__class__.testlist[10, 2, 3]>>> test2.testlist[10, 2, 3]

 

所有當我們通過類實例更改類屬性值時,要特別注意的是:看清類屬性對象是否可變(mutable/immutable),以免產生不必要的錯誤。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临潭县| 舒兰市| 青浦区| 黄浦区| 葫芦岛市| 呼玛县| 庐江县| 哈尔滨市| 陇南市| 乃东县| 高平市| 绥宁县| 景德镇市| 雷山县| 岑溪市| 丰顺县| 大连市| 阿图什市| 轮台县| 苍山县| 栾城县| 剑河县| 桓仁| 开阳县| 囊谦县| 财经| 农安县| 镇平县| 石渠县| 江安县| 九寨沟县| 德庆县| 都江堰市| 枣阳市| 崇义县| 巴马| 舒兰市| 金华市| 达州市| 鹤峰县| 乡城县|