日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python面向对象之类的成员

發(fā)布時(shí)間:2023/12/13 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python面向对象之类的成员 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

面向?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)部可以訪問;
class C:def __init__(self):passdef add(self):print('in C')class D(C):def show(self):print('in D')def func(self):self.show() obj = D() obj.show() # 通過對(duì)象訪問 obj.func() # 類內(nèi)部訪問 obj.add() # 派生類中訪問 class C:def __init__(self):passdef __add(self):print('in C')class D(C):def __show(self):print('in D')def func(self):self.__show() obj = D() obj.__show() # 通過不能對(duì)象訪問 obj.func() # 類內(nèi)部可以訪問 obj.__add() # 派生類中不能訪問

總結(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.AAA

isinstance與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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。