python面向对象之类的成员
面向?qū)ο笾惖某蓡T
細(xì)分類的組成成員
類大致分為兩塊區(qū)域:
第一部分:靜態(tài)字段
第二部分:動(dòng)態(tài)方法
class Animal:type_name = "動(dòng)物類" # 靜態(tài)變量(靜態(tài)字段)__feature = "活的" # 私有靜態(tài)變量(靜態(tài)字段)def __init__(self,name,size): # 特殊方法self.name = name # 對(duì)象屬性self.__size = size # 私有對(duì)象屬性(私有普通字段)def func1(self): # 普通方法passdef __func(self): # 私有方法print(666)@classmethod # 類方法def class_func(cls):print("類方法")@staticmethod # 靜態(tài)方法def static_func():print("靜態(tài)方法")@property # 屬性def prop(self):pass類的私有成員
對(duì)于每一個(gè)類的成員而言都有兩種形式:
? 公有成員,在任何地方都能訪問
? 私有成員,只有在類的內(nèi)部才能訪問
私有成員和公有成員的訪問限制不同:
靜態(tài)字段(靜態(tài)屬性)
? 公有靜態(tài)字段:類可以訪問;類內(nèi)部可以訪問;派生類中可以訪問
? 私有靜態(tài)字段:僅類內(nèi)部可以訪問
class C:name = "公有靜態(tài)字段"def func(self):print(C.name) class D:def show(self):print(C.name)C.name #類訪問obj = C() obj.func() # 類內(nèi)部可以訪問obj_son = D() obj_son.show() # 派生類中可以訪問 class C:__name = "私有靜態(tài)字段"def func(self):print(C.__name) class D(C):def show(self):print(C.__name) C.__name # 不可在外部訪問 obj = C() obj.__name # 不可在外部訪問 obj.func() # 類內(nèi)部可以訪問 obj_son = D() obj_son.show() #不可在派生類中可以訪問普通字段(對(duì)象屬性)
公有普通字段:對(duì)象中可以訪問;類內(nèi)部可以訪問;派生類中可以訪問
私有普通字段:僅類內(nèi)部可以訪問;
class C:def __init__(self):self.foo = "公有字段"def func(self):print(self.foo) # 類內(nèi)部訪問class D(C):def show(self):print(self.foo) # 派生類中訪問obj = C()obj.foo # 通過對(duì)象訪問 obj.func() # 類內(nèi)部訪問obj_son = D(); obj_son.show() # 派生類中訪問 class C:def __init__(self):self.__foo = "私有字段"def func(self):print(self.foo) # 類內(nèi)部訪問class D(C):def show(self):print(self.foo) # 派生類中訪問obj = C()obj.__foo # 通過對(duì)象訪問 ==> 錯(cuò)誤 obj.func() # 類內(nèi)部訪問 ==> 正確obj_son = D(); obj_son.show() # 派生類中訪問 ==> 錯(cuò)誤方法:
- 公有方法:對(duì)象可以訪問;類內(nèi)部可以訪問;派生類中可以訪問
- 私有方法:僅類內(nèi)部可以訪問;
總結(jié):
對(duì)于這些私有成員來說,他們只能在類的內(nèi)部使用,不能再類的外部以及派生類中使用.
*補(bǔ)充:非要訪問私有成員的話,可以通過 對(duì)象._類__屬性名,但是絕對(duì)不允許!!!*
*為什么可以通過._類__私有成員名訪問呢?因?yàn)轭愒趧?chuàng)建時(shí),如果遇到了私有成員(包括私有靜態(tài)字段,私有普通字段,私有方法)它會(huì)將其保存在內(nèi)存時(shí)自動(dòng)在前面加上_類名.*
類的其他成員
這里的其他成員主要就是類方法:
方法包括:普通方法、靜態(tài)方法和類方法,三種方法在內(nèi)存中都?xì)w屬于類,區(qū)別在于調(diào)用方式不同。
實(shí)例方法
? 定義:第一個(gè)參數(shù)必須是實(shí)例對(duì)象,該參數(shù)名一般約定為“self”,通過它來傳遞實(shí)例的屬性和方法(也可以傳類的屬性和方法);
? 調(diào)用:只能由實(shí)例對(duì)象調(diào)用。
類方法
? 定義:使用裝飾器@classmethod。第一個(gè)參數(shù)必須是當(dāng)前類對(duì)象,該參數(shù)名一般約定為“cls”,通過它來傳遞類的屬性和方法(不能傳實(shí)例的屬性和方法);
? 調(diào)用:實(shí)例對(duì)象和類對(duì)象都可以調(diào)用。
class Student:count = 0def __init__(self,name,age):self.name = nameself.age = ageStudent.cls_func()@classmethoddef cls_func(cls):cls.count = cls.count + 1@classmethoddef getnum(cls):return cls.count a = Student('alex',18) b = Student('bill',20) print(Student.getnum()) # 結(jié)果:2類方法的兩個(gè)作用:
1.得到類名實(shí)例化對(duì)象,
2.可以操作類的屬性.
靜態(tài)方法
? 定義:使用裝飾器@staticmethod。參數(shù)隨意,沒有“self”和“cls”參數(shù),但是方法體中不能使用類或?qū)嵗娜魏螌傩院头椒?#xff1b;
? 調(diào)用:實(shí)例對(duì)象和類對(duì)象都可以調(diào)用。
? 靜態(tài)方法是個(gè)獨(dú)立的、單純的函數(shù),它僅僅托管于某個(gè)類的名稱空間中,便于使用和維護(hù)。
雙下方法
屬性:
什么是屬性property
property是一種特殊的屬性,訪問它時(shí)會(huì)執(zhí)行一段功能(函數(shù))然后返回值
例一:BMI指數(shù)(bmi是計(jì)算而來的,但很明顯它聽起來像是一個(gè)屬性而非方法,如果我們將其做成一個(gè)屬性,更便于理解)成人的BMI數(shù)值: 過輕:低于18.5 正常:18.5-23.9 過重:24-27 肥胖:28-32 非常肥胖, 高于32體質(zhì)指數(shù)(BMI)=體重(kg)÷身高^2(m)EX:70kg÷(1.75×1.75)=22.86class People:def __init__(self,name,weight,height):self.name=nameself.weight=weightself.height=height@propertydef bmi(self):return self.weight / (self.height**2)p1=People('egon',75,1.85) print(p1.bmi)為什么要用property
將一個(gè)類的函數(shù)定義成特性以后,對(duì)象再去使用的時(shí)候obj.name,根本無法察覺自己的name是執(zhí)行了一個(gè)函數(shù)然后計(jì)算出來的,這種特性的使用方式遵循了統(tǒng)一訪問的原則
由于新式類中具有三種訪問方式,我們可以根據(jù)他們幾個(gè)屬性的訪問特點(diǎn),分別將三個(gè)方法定義為對(duì)同一個(gè)屬性:獲取、修改、刪除
class Foo:@propertydef AAA(self):print('get的時(shí)候運(yùn)行我啊')@AAA.setterdef AAA(self,value):print('set的時(shí)候運(yùn)行我啊')@AAA.deleterdef AAA(self):print('delete的時(shí)候運(yùn)行我啊')#只有在屬性AAA定義property后才能定義AAA.setter,AAA.deleter f1=Foo() f1.AAA f1.AAA='aaa' del f1.AAA或者: class Foo:def get_AAA(self):print('get的時(shí)候運(yùn)行我啊')def set_AAA(self,value):print('set的時(shí)候運(yùn)行我啊')def delete_AAA(self):print('delete的時(shí)候運(yùn)行我啊')AAA=property(get_AAA,set_AAA,delete_AAA) #內(nèi)置property三個(gè)參數(shù)與get,set,delete一一對(duì)應(yīng)f1=Foo() f1.AAA f1.AAA='aaa' del f1.AAAisinstance與issubclass
class A:passclass B(A):passobj = B()print(isinstance(obj,B)) print(isinstance(obj,A))isinstance(a,b):判斷a是否是b類(或者b類的派生類)實(shí)例化的對(duì)象
class A:passclass B(A):passclass C(B):passprint(issubclass(B,A)) print(issubclass(C,A))issubclass(a,b): 判斷a類是否是b類(或者b的派生類)的派生類
轉(zhuǎn)載于:https://www.cnblogs.com/lifangzheng/p/11354888.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python面向对象之类的成员的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java生鲜电商平台-SpringClo
- 下一篇: python之socket