Python中類、對象與self詳解

先介紹一下python中的類與對象/實例。然后詳細說明self。說明:對象等同實例,本文稱呼不一致時請自行統一

【一】類與對象/實例

1、類

  (1)類由名稱、屬性、方法三部分組成

  (2)類是抽象模板,比如學生,汽車可以用Student、Car類來表示

  (3)類命名規范:數字、字母、下劃線,數字不能開頭;要駝峰式命名

  (4)定義類:

    第一種:class 類名:(冒號縮進,代碼塊內含屬性與方法)

    第二種:class 類名(object):(--(Object)表示該類從哪個類繼承下來的,Object類是所有類都會繼承的類。--)

#子類繼承父類
class Parent:def pprt(self):print(self)class Child(Parent):    #表示子類從父類繼承def cprt(self):print(self)
c = Child()
c.cprt()        # Child類的實例
c.pprt()        #self指的是Child類的實例,父類Parent中定義了pprt()方法
p = Parent()
p.pprt()    # Parent類的實例

  (5)關于self:類函數需要定義一個‘self’,不用理會不需要賦值;self不是py關鍵字,但是必填;self可以用其他參數替代,如“this、a”,只是約定俗稱

  (6)如下圖:p.sayhello() ,實際上Python解釋成Person.sayhello(p),也就是說把self替換成類的實例

# 實例說明self代表是是對象/實例本身,而非類本身(類中包含多個對象)
#
self不必非寫成self,可以其它參數代替,只是約定俗成,但必須寫
class Person:def sayhello(self):print(self)print('***********分割線*************')print('My name is:linda') p=Person() p.sayhello() #等同:Person.sayhello(p)
# 如果我們的定義和調用時均不傳類實例是可以的,這就是類方法
class Person:def sayhello():print()print('***********分割線*************')print('My name is:linda')
p=Person()
Person.sayhello()   # 定義和調用均不傳類實例 

2、對象/實例

  (1)對象是由類 創建出來的實體,對象也稱實例

  (2)對象要從類中繼承方法,具有類里面所有屬性和方法的使用權限

  (3)創建方式:對象名 = 類()?? ---如: tom = Person()

class Person:def sayhello(self):print(self)print('***********分割線*************')print('My name is:linda')
p=Person()

3、__init__方法: ---也叫 初始化方法

    類中定義了__init__方法,則表示在創建對象時系統會默認調用此方法,也叫初始化方法

    ? 由于類起到模板的作用,因此,可以在創建實例的時候,把我們認為必須綁定的屬性強制填寫進去。這里就用到Python當中的一個內置方法__init__方法,例如在Person類時,把name、age等屬性綁上去:

      

?

    說明:

    1、類在創建對象時就已經有默認的屬性(如創建一輛汽車時就已經注定這個車子是什么品牌,有幾個輪子等),所以類的屬性一般定義在__init__方法中

    2、__init__方法在創建對象時候被調用,所以屬性通過(對象 = Car(屬性))傳入方法中

    【注意點】(1)__init__方法的第一參數永遠是self,表示self指向創建的類實例本身,因而,在__init__方法內部,可以把各種屬性綁定到self,等同于綁定創建的實例本身

         (2)__init__方法 在創建實例時,不可傳入空的參數,必須傳入與__init__方法匹配的參數,但self不需要傳,Python解釋器會自己把實例變量傳進去

         (3)如上圖: self.name = name的意思就是把外部傳來的參數name的值賦值給Person類自己的屬性變量self.name

            ??????????? 說明:self就是指類本身,self.name就是Person類的屬性變量,是Person類所有。而name是外部傳來的參數,不是Person類所自帶的。

【二】self的詳細說明

1、說明:

  (1)# 實例說明self代表是是對象/實例本身,而非類本身(類中可包含多個對象)

  (2)# self不必非寫成self,可以其它參數代替,只是約定俗成,但必須寫  

  (3)# 如果我們的定義和調用時均不傳類實例也是可以的

    

2、關于類函數/類方法

  【?】類函數與普通函數的區別:

     僅在于類函數:第一參數永遠是類的本身實例變量self,調用時,不用傳遞該參數     

  (1)方法,通俗點來說就是函數; ---把每一項類中所有的功能封裝起來稱為方法,一般方法里的內容就是方法的執行過程

     方法多具有執行性

     舉例: 比如類表示的是People 也就是人?

? ? ? ? ? ?    人的類中會有一些屬性 這些屬性大概是 身高、體重、姓名等等

? ? ? ? ? ?    那么方法比如是 跑、吃、等等

class Person(object):def __init__(self, name, age):self.name = nameself.age = ageprint('我叫{0},我今年{1}歲'.format(self.name,self.age))   #我叫小明,我今年18歲

person=Person("小明",18)
person.name
person.age

      【說明】Person類實例本身擁有一些數據,那么要訪問這些數據,就不需要從外面的函數去訪問,可直接在Person類的內部定義訪問數據的函數(方法),這樣,就可以把”數據”封裝起來。

          這些封裝數據的函數是和Person類本身是關聯起來的,稱之為類的方法

          我們從外部看Person類,只需要知道,創建實例需要給出name和age。

          而如何打印,都是在Person類的內部定義的,這些數據和邏輯被封裝起來了,調用很容易,但卻不知道內部實現的細節。

          如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線,在Python中,實例的變量名如果以開頭,就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問

          這樣就確保了外部代碼不能隨意修改對象內部的狀態,這樣通過訪問限制的保護,代碼更加健壯

          (注意)Python中,變量名類似__xxx__的,也就是以雙下劃線開頭,且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接訪問的,不是private變量,所以,不可以這樣命名

          

?

轉載于:https://www.cnblogs.com/nbnuan/articles/9805952.html

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

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

相關文章

面試題28 字符串排列

題目描述 輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。 輸入描述: 輸入一個字符串,長度不超過9(可能有字符重復),字符只包括大小寫字母。 1 cla…

javascript 框架_克服JavaScript框架疲勞

javascript 框架by Tero Parviainen通過Tero Parviainen 克服JavaScript框架疲勞 (Overcoming JavaScript Framework Fatigue) The JavaScript community is suffering from a wave of framework fatigue. It’s caused by the massive outpouring of new frameworks, techniq…

java開發環境:還在配classpath?你out啦!

2019獨角獸企業重金招聘Python工程師標準>>> 先說結論:只需要配置JAVA_HOME和path路徑即可,無需配置classpath 參考Oracle官網的說明: The class path tells JDK tools and applications where to find third-party and user-defi…

qpython3可以調用哪些庫_Python3 如何使用asyncio庫在調用第三方模塊(存在IO等待)的情況下實現協程?...

問題描述demo中有一個 task_check 的模塊,底層是用urllib實現,請問如果要實現使用 asyncio 庫實現協程操作,需要修改這個模塊的底層代碼嗎?如何修改? 往大佬指點問題出現的環境背景及自己嘗試過哪些方法平時都是使用 gevent 庫和 monkey.patch_all() 實現協程,但發現 gevent …

.Net Core 商城微服務項目系列(二):使用Ocelot + Consul構建具備服務注冊和發現功能的網關...

1.服務注冊 在上一篇的鑒權和登錄服務中分別通過NuGet引用Consul這個包,同時新增AppBuilderExtensions類: public static class AppBuilderExtensions{public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app,IApplicationLife…

java打印數組_Java中打印數組內容的方式有哪些?

下面是幾種常見的打印方式。方法一:使用循環打印。public class Demo {public static void main(String[] args) {String[] infos new String[] {"Java", "Android", "C/C", "Kotlin"};StringBuffer strBuffer new Strin…

$(function() {})

$(function() {});是$(document).ready(function(){ })的簡寫, 最早接觸的時候也說$(document).ready(function(){ })這個函數是用來取代頁面中的window.onload; 用來在DOM加載完成之后執行一系列預先定義好的函數。

恢復工具

EasyRecovery http://www.upantool.com/hfxf/huifu/2011/EasyRecovery_V6.22.html轉載于:https://www.cnblogs.com/cb168/p/5359133.html

四參數坐標轉換c++_GPSRTK坐標轉換及四參數、七參數適用條件

工程測量儀器已由經緯儀、全站儀過渡到GNSS(全球衛星導航系統),特別是公路行業,GPS-RTK作為GNSS的一種應用目前已十分普及。現階段GPS-RTK以WGS-84 坐標系統為主流,所發布的星歷參數也是基于此坐標系統,但隨著北斗導航系統的逐步完…

教主的魔法

傳送門 這道題序列很長,但是操作數很少,然后也沒想到什么好的數據結構來維護,那就分塊吧。 感覺維護的過程很好想,修改的時候對于整個塊都在內的直接打標記,兩個零散的區間暴力重構,重新排序。查詢的時候&a…

obs自定義編碼設置_通過7個步驟設置OBS進行實時編碼

obs自定義編碼設置by Wesley McCann韋斯利麥肯(Wesley McCann) 通過7個步驟設置OBS進行實時編碼 (Setting up OBS for Live Coding in 7 Steps) Twitch TV is a popular live-streaming service. You traditionally used Twitch to stream yourself playing video games, but …

java hadoop api_Hadoop 系列HDFS的Java API( Java API介紹)

HDFS的Java APIJava API介紹將詳細介紹HDFS Java API,一下節再演示更多應用。Java API 官網如上圖所示,Java API頁面分為了三部分,左上角是包(Packages)窗口,左下角是所有類(All Classes是)窗口,右側是詳情窗口。這里推…

最大連通子數組

這次是求聯通子數組的求和,我們想用圖的某些算法,比如迪杰斯特拉等,但是遇到了困難。用BFS搜索能達到要求,但是還未能成功。 那么我們這樣想,先將每行的最大子數組之和,然后再將這些最大之和組成一個數組&a…

redis的zset的底層實現_Redis(三)--- Redis的五大數據類型的底層實現

1、簡介Redis的五大數據類型也稱五大數據對象;前面介紹過6大數據結構,Redis并沒有直接使用這些結構來實現鍵值對數據庫,而是使用這些結構構建了一個對象系統redisObject;這個對象系統包含了五大數據對象,字符串對象(st…

科學計算機簡單編程_是“計算機科學”還是“編程”?

科學計算機簡單編程by Sam Corcos由Sam Corcos 是“計算機科學”還是“編程”? (Is It “Computer Science” or “Programming”?) 教育政策白皮書(提示:它們不是同一個東西) (An education policy white paper (hint: they’re not the same thing))…

[Matlab] 畫圖命令

matlab畫圖命令,不定時更新以便查找 set(gcf, color, [1 1 1]);     % 使圖背景為白色 alpha(0.4);           %設置平面透明度 plot(Circle1,Circle2,k--,linewidth,1.25);  % k--設置線型  ‘linewidth’,1.25  設置線寬度為1.25 %線型   …

django入門記錄 2

1. 創建一個app, python manage.py startapp appname 2. 設計model,在appname/目錄下編輯好model 3. 檢測model的修改,python manage.py makemigrations appname 4. 自動執行數據庫遷移,并同步管理數據庫結構, python…

spark sql 數據類型轉換_SparkSql 數據類型轉換

1、SparkSql數據類型 1.1數字類型 ByteType:代表一個字節的整數。范圍是-128到127 ShortType:代表兩個字節的整數。范圍是-32768到32767 IntegerType:代表4個字節的整數。范圍是-2147483648到2147483647 LongType:代表8個字節的整數。范圍是-9223372036854775808到92233720…

【Python】 list dict str

list & dict & str 這三種類型是python中最常用的幾種數據類型。他們都是序列的一種 ■  序列通用操作 1. 分片 s[a:b] 返回序列s中從s[a]到s[b-1]的片段。注意s[0:0]是空集而不是s[0] s[a:b:c]  加入第三個參數以設置取樣步長。可以設置成負數來從右向左取樣 2. 加…

終端terminal的顏色配置

PS1 color 終端terminal的顏色配置 PS1"\[\e[92;1m\][\u\e[90;5m\e[25m\[\e[91;4m\]Atlas\e[24m\[\e[1m\]\[\e[92;1m\] \W ]\\$\[\e[0m\]" Set CodeDescriptionExamplePreview1Bold/Bright echo -e "Normal \e[1mBold" 2Dim echo -e "Normal \e[2mDi…