Python基礎知識詳解 從入門到精通(七)類與對象

Python基礎知識詳解 從入門到精通(七)類與對象

本篇主要是介紹python,內容可先看目錄
其他基礎知識詳解,歡迎查看本人的其他文章
Python基礎知識詳解 從入門到精通(一)介紹
Python基礎知識詳解 從入門到精通(二)基礎
Python基礎知識詳解 從入門到精通(三)語法與函數
Python基礎知識詳解 從入門到精通(四)列表、元組、字典、集合
Python基礎知識詳解 從入門到精通(五)模塊管理
Python基礎知識詳解 從入門到精通(六)文件操作
Python基礎知識詳解 從入門到精通(八)魔法方法

定義類

注意,若類的方法與屬性名一樣。則屬性會覆蓋方法

一個類可以產生無數的對象,當對象的方法被調用時候,對象會將自身作爲第一個參數作爲self參數傳給方法,這樣子就可以分辨是哪一個變量在調用這個方法,所以定義方法時候第一個參數必定是self
關於self 不理解也沒關係,每一個函數都放在第一個函數即可

__ init __(self) 是魔法方法用於傳參數,使用方法如下
在類實例化開始時會自動被調用,可以用於一些開始時候需要做的事
用了__init__可以直接在生成對象時候傳參數
但是注意__init__不能返回數據,它默認放回None

關於魔法方法後期文章解釋

def  aa():
	print('dd')
class aa :
	 “這是類的說明”     #  用類名.__doc__ 可以輸出
	g = 3
	def jj(self):
	    aa()       #可以調用全局函數
		print(‘jjjjj’)

class bb#屬性,,,,,,就是變量的值,,,比如魚是紅色的,多大,這些是屬性
	a= 1
	b = ‘sssss’                  #這是類屬性,所有實例共有的,只要一個實例修改了它,全部實例都改變
    	#方法      就是類內的函數
	def sename(self,name):
		self.name = nema      #如self.xxxx是實例屬性,每個實例互不影響
	def pr(self)
		print(self.name)
	def hhh(self):
		pass
class cc:
	def __init__(self,name)
		self.name = name
		self.pr      #可以調用下面的函數
	def pr(self)
		print (self.name)


使用

實例名.__dict__可以查看實例的屬性(字典類型)
類名.__dict__可以查看類的屬性(字典類型)

以上定義中aa爲類,a爲實例對象
還可以直接使用類對象 如aa.g 這是類對象

爲了區分函數與類
約定類大寫開頭,函數小寫開頭

如實例對象

a = aa()
a.jj()
#結果爲  jjjjj
a = bb()
a.setname(‘gfx’)
a.pr()
#結果爲gfx
#如cc中使用了__init__可以直接在生成對象時候傳參數
a = cc(‘gfx’)
a.	pr()
#結果爲gfx

#實例對象可以直接加屬性
#如a.hh = 8     相當於加一個hh屬性
#實例對象使用時可以修改屬性的值
#a.g +=3
#則a.g    結果爲6

使用類對象

a = aa()
b = aa()
c = aa() 
#a,b,c是不同的實例對象
#如a.g    結果爲3
b.g     結果爲3
a.g +=3
#則a.g    結果爲6
b.g     結果爲3
#但若使用類對象,會直接改變類的屬性
aa.g = 8
#則a.g    結果爲8
b.g     結果爲8
 
 

訪問屬性

a.g 可以訪問
也可以
用getattr(實例對象名,‘屬性名’,‘若無此屬性返回內容’)

但是方法只有實例對象才能調用,這個也是python的綁定概念

定義了實例對象,再刪除該類,這個實例對象也是可以用的,

私有定義

由雙下劃線開頭的爲私有定義 __ a
不可被外部調用,只能內部


class dd:
	__a = 4
	def  get(self)
		return __a
#使用		
g =dd
g.__a          #不合法

外部使用私有變量
假如要在外部用a,需要藉助方法get
g.get() 即可

實際上python的私有是一種 ‘假私有’(名字重整)
這是改變了變量名字 改爲 __類名__變量名
所以g.__dd__a也可以在外部調用

繼承操作:

class 類1名(類2名): 繼承操作:類1繼承類2的方法和屬性

不能繼承私有方法和屬性
繼承是有順序的,從左往右,若有同名方法或屬性,先繼承前面的,後面的被屏蔽

如果子類中還定義與父類同名的方法或屬性,則自動覆蓋父類的對應的方法或屬性

注意子類中再用__init__可能會覆蓋父類中的需要的變量
解決方法有兩個
一. 調用未綁定的父類方法
如 定義子類時 父類名.__ init __(self)即可
二. 使用super函數
用法在子類中 super().父類中需要的方法名()

如 super().__ init __() 可以自動找父類,以後也不用修改

可以多重繼承,class 類1名(父類1名,父類3名,父類四名……):
如class ff (aa,cc,dd):

組合

即多個對象的組合、
就是把類的實例化放到另一個組合裏

class adef __init__(self,x)
		self.num = x
class c :
	def __init__(self,y)
		self.num = y
class d :
	def __init__(self,x,y)
		self.a = a(x)
		self.c = c(y)
	def pr(self)
		print(‘a有%d個,c有%d個‘%(self.a.num , self.c.num)
結果爲
g = d (34)
A有3個,c有4

相關的BIF(內置函數)

  1. issubclass(class,classinfo)
    若第一個參數class 是第二個參數的子類或者本身返回true 否則返回false
    第二個參數可以是一個元組,裏面有各個類,只有其中一個是第一個的父類即符合條件
    如issubclass(class,object) 返回true,,,,object是所有類的一個基類,所有類默認繼承object

  2. isinstance(實例對象名,classinfo)
    檢擦實例對象是否屬於第二個參數類,是則返回true 否則則反之
    第二個參數可以是一個元組,裏面有各個類,只有其中一個即可
    如果第一個參數不是傳入對象,一直返回false

  3. hasattr(對象名,name)
    若對象裏面有第二個參數這個屬性,有則true,name是一個字符串有‘‘ 或“”

  4. getattr(對象名,name [, default])
    返回對象指定屬性的值,若指定屬性不存在將[, default的值打印出來,若不輸入[, default]則返回異常

  5. s etattr(對象名,name ,value)
    設定對象中指定屬性的值,若屬性不存在則新建一個屬性並賦值

  6. delattr(對象名,name)
    刪除對象的指定屬性,若屬性不存在則異常

  7. Property (fget = None, fset =None ,fdel = None,doc = None)
    去設置一個存在的屬性
    Fget,是獲取屬性的方法
    Fset設置屬性的方法
    Fdel刪除屬性的方法
    但是具體方法要自己傳入
    使用

class qdef __init__(self,size=10):
		self.size = size
	def get(self):
		return Self.size
	def set(self,value):
		self.size = value
	def dellll ():
		del self.size
	x = property (get, set,dellll)
則
設置size
q.x = 78
使用size
q.x
刪除size
del q.x

最後

持續更新arduino 樹莓派 python 等等
接到有幫助的話 求點贊👍 求關注❤️ 求分享👥
有問題可以評論
點關注,不迷路
如果有任何錯誤,如何建議,請批評指教,不勝感激 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章