日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:深入理解python面向?qū)ο?類成員

Python是一個面向?qū)ο蟮恼Z言,但是因為python語言的特性,我們大多的python程序員只是把它當(dāng)做一個工具,在我們項目的實(shí)際使用中除了使用Django框架以外,其他的都是使用python最基礎(chǔ)的方式,完全跟pythonic沒有一點(diǎn)關(guān)系,當(dāng)然主要還是因為我們能力太差。面向?qū)ο笫菚鴮懜鞣N框架的基礎(chǔ),python的面向?qū)ο蟛粌H擁有通用面向?qū)ο蟮奶匦?,而且還擁有一些極其強(qiáng)大的特性,可以讓我們把它的便利性發(fā)揮到極致。本篇將詳細(xì)介紹Python 類的成員、成員修飾符、類的特殊成員。

類的成員

類的成員可以分為三個方面:字段、方法和屬性。

在定義一個類以后,方法、屬性和靜態(tài)字段都是屬于類的,在內(nèi)存中只保存一份,只有普通字段是屬于類對象的,每個類對象都會創(chuàng)建并保存一份。

我們可以將存儲區(qū)分為幾種:程序存儲區(qū)、全局存儲區(qū)、靜態(tài)存儲區(qū)、棧存儲區(qū)。

程序存儲區(qū): 我們所有的普通函數(shù)、類函數(shù)、類等程序所存儲的位置。

全局存儲區(qū):所有全局變量的存儲區(qū)。

靜態(tài)存儲區(qū):類的靜態(tài)變量存儲區(qū)。

棧存儲區(qū):棧存儲區(qū)就是局部變量存儲,所有的局部變量、類對象等都存儲在這里。

字段

字段包括:普通字段和靜態(tài)字段,使用和定義都是不一樣的,其最本質(zhì)的區(qū)別就是內(nèi)存中保存的位置不同。

普通字段屬于對象

靜態(tài)字段屬于類

class Demo:
    aa = "我是靜態(tài)字段"
    def __init__(self, name):
        self.bb = name    def custom_func(self, name):
        self.cc = name
obj1 = Demo(11)
Demo.aa = 111111obj1.aa = 1obj1.custom_func(1111)
obj2 = Demo(22)
obj2.aa = 2Demo.aa = 222222obj2.custom_func(2222)

print("obj1.aa = ", obj1.aa)
print("obj1.bb = ", obj1.bb)
print("obj1.cc = ", obj1.cc)
print("Demo.aa = ", Demo.aa)

print("obj2.aa = ", obj2.aa)
print("obj2.bb = ", obj2.bb)
print("obj2.cc = ", obj2.cc)
print("Demo.aa = ", Demo.aa)

print("id(Demo.aa) = ", id(Demo.aa))
print("id(obj1.aa) = ", id(obj1.aa))
print("id(obj2.aa) = ", id(obj2.aa))

輸出

obj1.aa =  1
obj1.bb =  11
obj1.cc =  1111
Demo.aa =  222222
obj2.aa =  2
obj2.bb =  22
obj2.cc =  2222
Demo.aa =  222222
id(Demo.aa) =  4645988944
id(obj1.aa) =  4530158768
id(obj2.aa) =  4530158800

從上面我們可以看出,bb、cc為普通字段,每個類獨(dú)有一份,相互不影響,而且需要使用類對象訪問,而Demo.aa和obj.aa是不同的,我們看到obj.aa的行為與普通字段類似,如果去掉obj1.aa=xx和obj2.aa=xx,那么obj1.aa和Demo.aa是相同的,在內(nèi)存中的地址也是相同的。這里涉及到python類的另外一種特性-臨時屬性。

通常情況下我們都使用普通字段,當(dāng)一個變量在類的所有對象中共同使用,而且數(shù)據(jù)共享的時候,我們就可以使用靜態(tài)字段。

方法

方法包括:普通方法、靜態(tài)方法和類方法。他們的區(qū)別在于調(diào)用方式不同。

普通方法:由對象調(diào)用;包含一個self參數(shù);執(zhí)行普通方法時,自動將調(diào)用該方法的對象賦值給self;

類方法:由類調(diào)用; 包含一個cls參數(shù);執(zhí)行類方法時,自動將調(diào)用該方法的類復(fù)制給cls;

靜態(tài)方法:由類調(diào)用;沒有默認(rèn)參數(shù);

class Foo:
    FooName = "靜態(tài)字段"
    def custom_func(self, name):
        # 普通方法,至少包含一個self參數(shù)
        print("普通方法")    @classmethod
    def class_func(cls, name):
        # 類方法,至少包含一個cls參數(shù)
        print("類方法")    @staticmethod
    def static_func(name):
        # 靜態(tài)方法,沒有默認(rèn)參數(shù)
        print("靜態(tài)方法")

f = Foo()# 調(diào)用普通方法f.custom_func("aaa")# 調(diào)用類方法Foo.class_func("bbb")# 調(diào)用靜態(tài)方法Foo.static_func("ccc")

普通方法中可以直接使用對象的普通字段self.name

類方法中可以直接使用靜態(tài)字段cls.FooName

靜態(tài)方法中不能直接使用普通字段和靜態(tài)字段

注意:靜態(tài)字段Foo.FooName可以在任意地方調(diào)用,包括以上三種場景內(nèi),如果在普通方法中也可以使用 self.FooName調(diào)用,前提是對象沒有同名的普通字段

屬性

上面我們已經(jīng)介紹了Python類中的方法,那么屬性就非常簡單了,因為Python中的屬性其實(shí)是普通方法的變種。

對于屬性,有以下兩個知識點(diǎn):

基本使用

兩種定義方式

class Foo:
    def func(self):
        pass    @property
    def prop(self):
        print("屬性")

f = Foo()# 調(diào)用函數(shù)f.func()# 調(diào)用屬性f.prop

通過上面的例子,我們知道屬性有以下幾點(diǎn):

普通方法上添加@property裝飾器

有且只能有一個self參數(shù),不能額外增加參數(shù)

調(diào)用時不需要括號

我們在做網(wǎng)頁數(shù)據(jù)展示的時候,頁面上顯示數(shù)據(jù)的數(shù)據(jù),不可能一次性把數(shù)據(jù)庫中的所有內(nèi)容都顯示在頁面上,一般都是通過分頁功能實(shí)現(xiàn),所以每次請求都會根據(jù)當(dāng)前頁數(shù)current_page和每頁顯示數(shù)量page_count來取出指定范圍的數(shù)據(jù)

class Pager:
    def __init__(self, current_page):
        # 當(dāng)前顯示的頁碼
        self.current_page = current_page        # 每頁默認(rèn)顯示數(shù)據(jù)
        self.per_items = 10    @property
    def start(self):
        return (self.current_page - 1) * self.per_items    @property
    def end(self):
        return self.current_page * self.per_items

pages = Pager(1)
pages.start # 起始值pages.end   # 結(jié)束值

屬性的兩種定義方式

屬性的定義有兩種方式:

裝飾器:在方法上應(yīng)用裝飾器

靜態(tài)字段:在類中定義值為property對象的靜態(tài)字段

我們知道Python中的類有經(jīng)典類和新式類之分,如果類繼承自object,那么該類是新式類,新式類的屬性比經(jīng)典類更豐富。但是現(xiàn)在都已經(jīng)使用python3了,而python3中默認(rèn)類都繼承自object,所以python3中全是新式類。

1. 裝飾器方式:普通方法加上@property裝飾器

class Goods:    @property
    def price(self):
        print("@property")    @price.setter
    def price(self, val):
        print("@price.setter: ", val)    @price.deleter
    def price(self):
        print("@price.deleter")

obj = Goods()
obj.price            # 自動執(zhí)行@property修飾的price方法,并獲取方法的返回值obj.price = 100  
                     #自動執(zhí)行@price.setter修飾的price方法,并將100賦值給方法的參數(shù)del obj.price     
                     # 自動執(zhí)行@price.deleter修飾的price方法

2. 靜態(tài)字段方式,使用property創(chuàng)建靜態(tài)字段

property是一個類,在builtins.py文件中,初始化函數(shù):def __init__(self, fget=None, fset=None, fdel=None, doc=None),有四個參數(shù)

第一個參數(shù)fget是方法名,調(diào)用 對象.屬性 時自動觸發(fā)執(zhí)行方法

第二個參數(shù)fset是方法名,調(diào)用 對象.屬性 = XXX 時自動觸發(fā)執(zhí)行方法

第三個參數(shù)fdel是方法名,調(diào)用 del 對象.屬性 時自動觸發(fā)執(zhí)行方法

第四個參數(shù)doc是字符串,調(diào)用 對象.屬性.doc ,此參數(shù)是該屬性的描述信息

class Foo:
    def __init__(self):
        self.price = 10

    def get_price(self):
        return self.price    # set函數(shù)必須有兩個參數(shù)
    def set_price(self, value):
        self.price = value    def del_price(self):
        del self.price

    PRICE = property(get_price, set_price, del_price, "description Price")

f = Foo()
print(f.PRICE)    # 自動調(diào)用get_pricef.PRICE = 20     
                  # 自動調(diào)用set_priceprint(f.PRICE)    
                  # 自動調(diào)用del_pricedel f.PRICE        
                  # 自動調(diào)用description Price

文章題目:創(chuàng)新互聯(lián)Python教程:深入理解python面向?qū)ο?類成員
鏈接分享:http://www.dlmjj.cn/article/cdgshcj.html