python面向對象之類的成員

面向對象之類的成員

細分類的組成成員

類大致分為兩塊區域:

第一部分:靜態字段

第二部分:動態方法

class Animal:type_name = "動物類"   # 靜態變量(靜態字段)__feature = "活的"   # 私有靜態變量(靜態字段)def __init__(self,name,size):  # 特殊方法self.name = name   # 對象屬性self.__size = size   # 私有對象屬性(私有普通字段)def func1(self):  # 普通方法passdef __func(self):  # 私有方法print(666)@classmethod   # 類方法def class_func(cls):print("類方法")@staticmethod  # 靜態方法def static_func():print("靜態方法")@property  # 屬性def prop(self):pass  

類的私有成員

對于每一個類的成員而言都有兩種形式:

? 公有成員,在任何地方都能訪問

? 私有成員,只有在類的內部才能訪問

私有成員和公有成員的訪問限制不同:

靜態字段(靜態屬性)

? 公有靜態字段:類可以訪問;類內部可以訪問;派生類中可以訪問

? 私有靜態字段:僅類內部可以訪問

class C:name = "公有靜態字段"def func(self):print(C.name)
class D:def show(self):print(C.name)C.name  #類訪問obj = C()
obj.func()  # 類內部可以訪問obj_son = D()
obj_son.show()  # 派生類中可以訪問
class C:__name = "私有靜態字段"def func(self):print(C.__name)
class D(C):def show(self):print(C.__name)
C.__name    # 不可在外部訪問
obj = C()
obj.__name  # 不可在外部訪問
obj.func()     # 類內部可以訪問   obj_son = D()
obj_son.show() #不可在派生類中可以訪問  

普通字段(對象屬性)

公有普通字段:對象中可以訪問;類內部可以訪問;派生類中可以訪問

私有普通字段:僅類內部可以訪問;

class C:def __init__(self):self.foo = "公有字段"def func(self):print(self.foo)  # 類內部訪問class D(C):def show(self):print(self.foo) # 派生類中訪問obj = C()obj.foo     # 通過對象訪問
obj.func()  # 類內部訪問obj_son = D();
obj_son.show()  # 派生類中訪問
class C:def __init__(self):self.__foo = "私有字段"def func(self):print(self.foo)  # 類內部訪問class D(C):def show(self):print(self.foo) # 派生類中訪問obj = C()obj.__foo     # 通過對象訪問    ==> 錯誤
obj.func()  # 類內部訪問        ==> 正確obj_son = D();
obj_son.show()  # 派生類中訪問  ==> 錯誤

方法:

  • 公有方法:對象可以訪問;類內部可以訪問;派生類中可以訪問
  • 私有方法:僅類內部可以訪問;
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()  # 通過對象訪問   
obj.func()  # 類內部訪問    
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()  # 通過不能對象訪問
obj.func()  # 類內部可以訪問
obj.__add()  # 派生類中不能訪問

總結:

對于這些私有成員來說,他們只能在類的內部使用,不能再類的外部以及派生類中使用.

*補充:非要訪問私有成員的話,可以通過 對象._類__屬性名,但是絕對不允許!!!*

*為什么可以通過._類__私有成員名訪問呢?因為類在創建時,如果遇到了私有成員(包括私有靜態字段,私有普通字段,私有方法)它會將其保存在內存時自動在前面加上_類名.*

類的其他成員

這里的其他成員主要就是類方法:

方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬于類,區別在于調用方式不同。

實例方法

? 定義:第一個參數必須是實例對象,該參數名一般約定為“self”,通過它來傳遞實例的屬性和方法(也可以傳類的屬性和方法);

? 調用:只能由實例對象調用。

類方法

? 定義:使用裝飾器@classmethod。第一個參數必須是當前類對象,該參數名一般約定為“cls”,通過它來傳遞類的屬性和方法(不能傳實例的屬性和方法);

? 調用:實例對象和類對象都可以調用。

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())
# 結果:2

類方法的兩個作用:

1.得到類名實例化對象,

2.可以操作類的屬性.

靜態方法

? 定義:使用裝飾器@staticmethod。參數隨意,沒有“self”和“cls”參數,但是方法體中不能使用類或實例的任何屬性和方法;

? 調用:實例對象和類對象都可以調用。

? 靜態方法是個獨立的、單純的函數,它僅僅托管于某個類的名稱空間中,便于使用和維護。

雙下方法

屬性:

什么是屬性property

property是一種特殊的屬性,訪問它時會執行一段功能(函數)然后返回值

例一:BMI指數(bmi是計算而來的,但很明顯它聽起來像是一個屬性而非方法,如果我們將其做成一個屬性,更便于理解)成人的BMI數值:
過輕:低于18.5
正常:18.5-23.9
過重:24-27
肥胖:28-32
非常肥胖, 高于32體質指數(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

將一個類的函數定義成特性以后,對象再去使用的時候obj.name,根本無法察覺自己的name是執行了一個函數然后計算出來的,這種特性的使用方式遵循了統一訪問的原則

由于新式類中具有三種訪問方式,我們可以根據他們幾個屬性的訪問特點,分別將三個方法定義為對同一個屬性:獲取、修改、刪除

class Foo:@propertydef AAA(self):print('get的時候運行我啊')@AAA.setterdef AAA(self,value):print('set的時候運行我啊')@AAA.deleterdef AAA(self):print('delete的時候運行我啊')#只有在屬性AAA定義property后才能定義AAA.setter,AAA.deleter
f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA或者:
class Foo:def get_AAA(self):print('get的時候運行我啊')def set_AAA(self,value):print('set的時候運行我啊')def delete_AAA(self):print('delete的時候運行我啊')AAA=property(get_AAA,set_AAA,delete_AAA) #內置property三個參數與get,set,delete一一對應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類的派生類)實例化的對象

class A:passclass B(A):passclass C(B):passprint(issubclass(B,A))
print(issubclass(C,A))

issubclass(a,b): 判斷a類是否是b類(或者b的派生類)的派生類

轉載于:https://www.cnblogs.com/lifangzheng/p/11354888.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247146.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python元類、反射及雙線方法

元類、反射及雙線方法 元類 print(type(abc)) print(type(True)) print(type(100)) print(type([1, 2, 3])) print(type({name: 太白金星})) print(type((1,2,3))) print(type(object))class A:passprint(isinstance(object,type)) print(isinstance(A, type)) type元類是獲取該…

iOS中的多線程一般使用場景

在IOS開發中為提高程序的運行效率會將比較耗時的操作放在子線程中執行,iOS系統進程默認啟動一個主線程,用來響應用戶的手勢操作以及UI刷新,因此主線程又叫做UI線程。 前面的Blog說明了NSThread以及GCD處理并發線程以及線程安全(線…

iOS中如何優化Cell中圖片的下載性能

在iOS開發中使用最為常見的是UITableView,其中UITabelViewCell中下載圖片,會影響用戶下拉刷新UI,導致卡頓,用戶體驗不好,在這篇blog中,我將以一個例子來說明如何優化UITableView下載圖片 1.使用懶加載方式&#xff0c…

【Yoshua Bengio 親自解答】機器學習 81 個問題及答案(最全收錄)

本文轉自:http://mp.weixin.qq.com/s?__bizMzI3MTA0MTk1MA&mid401958262&idx1&sn707f228cf5779a31f0933af903516ba6&scene1&srcid0121zzdeFPtgoRoEviZ3LZDG#rd 譯者:張巨巖 王婉婷 李宏菲 戴秋池 這是 Quora 的最新節目&#xf…

Java生鮮電商平臺-SpringCloud微服務架構中網絡請求性能優化與源碼解析

Java生鮮電商平臺-SpringCloud微服務架構中網絡請求性能優化與源碼解析 說明:Java生鮮電商平臺中,由于服務進行了拆分,很多的業務服務導致了請求的網絡延遲與性能消耗,對應的這些問題,我們應該如何進行網絡請求的優化與…

XCode7 創建framework

1.新建一個靜態庫工程. file→ new→ project, 彈出框中選擇iOS→ framework & library中的cocoa touch static library.點擊Next,輸入product name: TestFramework, 點擊Next→ 點擊Create. 2.刪除向導所生成工程中的Target. 點擊工程名→ 點擊TARGETS → 右鍵Delete. …

基礎js逆向練習-登錄密碼破解(js逆向)

練習平臺:逆向賬號密碼 https://login1.scrape.center/ 直接打開平臺,輸入密碼賬號,抓包找到加密的參數攜帶的位置,這邊我們找到的是一個叫token的加密參數,這個參數的攜帶是一個密文 我們首先考慮一下搜索這個加密的…

python之socket

socket套接字 什么叫socket socket是處于應用層與傳輸層之間的抽象層,他是一組操作起來非常簡單的接口(接受數據)此接口接受數據之后,交由操作系統.socket在python中就是一個模塊. socket兩個分類 基于文件類型的套接字家族 套接字家族的名字:AF_UNIX unix一切皆文件…

iOS----JSON解析

在iOS開發中與服務器進行數據交互操作,操作過程中使用最為常見的格式為JSON與XML,其中JSON較為清量,因此本篇blog就講解一下如何在iOS中進行JSON解析。 1.建立HTTP請求 (1)創建URL NSString *URLStr [NSString stringWithFormat:”http:/…

VS中每次改代碼后運行程序不更新,只有重新編譯才生效。

解決方法:將項目移除解決方案,再重新添加進來,即添加->現有項目->選擇.vcxproj文件,即可解決。 轉載于:https://www.cnblogs.com/Gregg/p/11358711.html

socket補充:通信循環、鏈接循環、遠程操作及黏包現象

socket補充:通信循環、鏈接循環、遠程操作及黏包現象 socket通信循環 server端: import socketphone socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.bind((127.0.0.1,8080))phone.listen(5)conn, client_addr phone.accept() print(conn, cl…

PCA的原理及MATLAB實現

相關文章 PCA的原理及MATLAB實現 UFLDL教程:Exercise:PCA in 2D & PCA and Whitening python-A comparison of various Robust PCA implementations --------&a…

Java生鮮電商平臺-SpringCloud微服務架構中核心要點和實現原理

Java生鮮電商平臺-SpringCloud微服務架構中核心要點和實現原理 說明:Java生鮮電商平臺中,我們將進一步理解微服務架構的核心要點和實現原理,為讀者的實踐提供微服務的設計模式,以期讓微服務在讀者正在工作的項目中起到積極的作用。…

iOS中下載小文件

在iOS中通過網絡下載小文件比如小型圖片等資源,一般在子線程中將數據完全下載完畢,然后在調用block將下載的數據整個部分返回,或者采用同步返回下載數據。 一般采用以下兩種方式: (1)使用GCD將下載操作放…

iOS下載大文件原理解析一

iOS中下載大型文件,需要考慮到占用內存的大小與下載速度(使用多線程),因此本文首先介紹一個原理性下載文件的DEMO。 在下載大型文件中,需要知道下載的進度因此需要使用代理模式,不斷的回調下載進度。 - (…

recv原理、高階版黏包解決方案、基于UDP的socket通信

recv原理、高階版黏包解決方案、基于UDP的socket通信 recv原理 源碼解釋: Receive up to buffersize bytes from the socket. 接收來自socket緩沖區的字節數據, For the optional flags argument, see the Unix manual. 對于這些設置的參數,可…

iOS中下載大型文件的原理解析二

在iOS中下載大型文件,需要使用NSURLConnection 的代理方法: (void)touchesBegan:(NSSet)touches withEvent:(UIEvent *)event { NSURL *url [NSURL URLWithString:”http://d.3987.com/fengj_141112/007.jpg“]; NSURLRequest *request [NSURLReque…

ASP.NET Core Web 應用程序開發期間部署到IIS自定義主機域名并附加到進程調試

想必大家之前在進行ASP.NET Web 應用程序開發期間都有用到過將我們的網站部署到IIS自定義主機域名并附加到進程進行調試。 那我們的ASP.NET Core Web 應用程序又是如何部署到我們的IIS上面進行調試的呢,接下來我們來簡單介紹下: 一、安裝IIS所需的Host擴…

iOS下載大型文件原理解析三

在下載大型文件過程中是可以取消下載的 - (IBAction)download:(UIButton *)sender { // 狀態取反 sender.selected !sender.isSelected; // 斷點續傳 // 斷點下載if (sender.selected) { // 繼續(開始)下載// 1.URLNSURL *url [NSURL URLWithStrin…