十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
這篇文章將為大家詳細(xì)講解有關(guān)python面向?qū)ο?類成員的案例分析,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Python是一個面向?qū)ο蟮恼Z言,但是因?yàn)閜ython語言的特性,我們大多的python程序員只是把它當(dāng)做一個工具,在我們項(xiàng)目的實(shí)際使用中除了使用Django框架以外,其他的都是使用python最基礎(chǔ)的方式,完全跟pythonic沒有一點(diǎn)關(guān)系,當(dāng)然主要還是因?yàn)槲覀兡芰μ?。面向?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類中的方法,那么屬性就非常簡單了,因?yàn)镻ython中的屬性其實(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
關(guān)于python面向?qū)ο?類成員的案例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。