學Python劃重點 三 (類的知識點總結)

面向對象思想有三個基本特徵:封裝、繼承和多態

一、創建和使用類

實例:

# 類的定義
class Dog():
	def __init__(self, name, age):
		self.name = name
		self.age = age
	def sit(self):
		print(self.name + " is now sitting.")
	def roll_over(self):
		print(self.name + " rolled over!")
# 類使用
dog = Dog("xiao","1")
dog.sit()

知識點:

1. 初始化方法 _init _()

形參 self 必不可少,還必須位於其他形參的前面,每個與類相關聯的方法調用都自動傳遞實參 self ,它是一個指向實例本身的引用,讓實例能夠訪問類中的屬性和方法。self 會自動傳遞,因此我們不需要傳遞它。

2. 析構方法是__del__()

3. 定義枚舉類

class  枚舉類名(enum.Enum):
	枚舉常量列表

在這裏插入圖片描述


二、類成員的介紹

1. 類變量

屬於類本身的變量,即類變量。類變量屬於整個類,不是特定實例的一部分,而是所有實例之間共享一個副本,類變量要在方法之外定義。

class Dog():
    count=0 # 類變量
    def __init__(self, name, age):
	    self.name = name #實例變量
	    self.age = age #實例變量
# 類使用
dog = Dog("xiao","1")
Dog.count += 1 # 類變量的訪問與操作
dog.name # 實例變量的訪問

# 注意:如果通過實例變量對類變量賦值操作,這樣會爲實例創建一個同名的變量,從而覆蓋類變量
# 通過實例訪問 類變量或者類方法時,其原理都是先訪問實例中是否存在該值,如果不存在纔會訪問類變量和類方法
dog.count =1

當通過實例讀取變量時,Python 解釋器會先在實例中找這個變量,如果沒有找到再到類中去找;當通過實例爲變量賦值時,無論類中是否有該同名類變量,Python 解釋器都會創建一個同名實例變量。

2. 類方法

通過@classmethod來聲明類方法。
“類方法”與“類變量”類似,屬於類不屬於個體實例的方法,類方法不需要與實例綁定,但需要與類綁定,定義時它的第一個參數不是self ,而是類的type 實例

#  類方法
class Dog():
	count=0 # 類變量
	@classmethod 
	def getName(cls, name): #類方法
		return name+"是第"+str(cls.count)+"只狗"

3. 靜態方法

class Dog():
	count=0 # 類變量
	@staticmethod
	def getName(name): #靜態方法
		return name+"是第"+str(Dog.count)+"只狗"

4. 訪問權限

_xxx :受保護成員;
__xxx :私有成員;
__xxx__ :系統定義的特殊成;

注意:Python 沒有嚴格的私有成員,所謂的私有python只是將__ 變量修改爲_ 類名__ 變量 ,所以還是可以通過“ 對象._ 類名__ 變量”進行訪問。

5. 定義屬性

@ property用來修飾getter 訪問器,@ 屬性名.setter用來修飾setter 訪問器。
這個定義屬性和C#裏面差不多。

class Dog():
	def __init__(self, name, year=1):
		self.name= nam
		self.__year = year
		
	# 定義屬性
	@property
	def year(self):
		return self.__year
	@weight.setter
	def year(self, year):
		self.__year = year

# 訪問屬性
dog=Dog("xiao",1)
dog.year # 注意訪問的方式,不是以前那種通過get set 方法來訪問屬性了

三、類的繼承

大多數的編程語言是不支持多繼承的,因爲多繼承會發生類成員名出現衝突。
Python 是支持多繼承的 ,
Python 解決名稱衝突的方法是:
這個 方案是,當子類實例調用一個方法時,先在子類中查找,如果沒有找到則查找父類。 父類的查找順序是按照子類聲明的父類列表從左到右 查找,如果沒有找到再找父類的父類,依次查找下去。

class ElectricCar(Car):
	def __init__(self, year):
		super().__init__(make, model, year)# 繼承時需要對父類進行初始化

1. 對父類進行初始化最好使用:super().__init__方式。
2.多繼承時,使用super() 方法,由於python 中super() 算法的原因,必須把全部的參數傳遞給父類,否則會報錯 。
3.單繼承時,使用super 方法() ,參數不能全部傳遞,只能傳父類方法所需的參數,否則會報錯。

類型檢查函數:

isinstance(object,classsinfo) 函數,它可以檢查object 實例是否由classinfo 類或classinfo 子類所創建的實例。
issubclass (class, classsinfo) 函數,它用來檢查class 是否是classinfo 的子類。


四、類的魔法方法

所謂的魔法方法就是帶雙下劃線開頭的方法。

  1. __str__():返回該對象的字符串表示;
  2. __eq__():指示其他某個對象是否與此對象“相等”,"=="時調用;
  3. __init__():初始化方法;
  4. __del__():析構方法;
  5. __new__():構造方法;
  6. __getattribute__(self,name):定義當該類的屬性被訪問時的行爲;
  7. __setattr__(self,name,value):定義當一個屬性被設置時的行爲;
  8. __delattr__(self,name):定義當一個屬性被刪除時的行爲;
  9. __hasattr__(object,name):檢查對象是否有此屬性;
  10. __getattr__(object,name[,default]):獲得屬性值,如果不存在則返回默認值default ;
  11. property(fget,fset,fdel):設置一個屬性,三個參數爲函數;

五、模塊的導入

import car
import time as t
from  module_name import *
from  module_name import Car
from  module_name import Car as C

當模塊作爲主程序運行時,__name__==__main__


今天睡了一下午,還是舒服的!!!

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