面向對象思想有三個基本特徵:封裝、繼承和多態
一、創建和使用類
實例:
# 類的定義
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 的子類。
四、類的魔法方法
所謂的魔法方法就是帶雙下劃線開頭的方法。
__str__()
:返回該對象的字符串表示;__eq__()
:指示其他某個對象是否與此對象“相等”,"=="時調用;__init__()
:初始化方法;__del__()
:析構方法;__new__()
:構造方法;__getattribute__(self,name)
:定義當該類的屬性被訪問時的行爲;__setattr__(self,name,value)
:定義當一個屬性被設置時的行爲;__delattr__(self,name)
:定義當一個屬性被刪除時的行爲;__hasattr__(object,name)
:檢查對象是否有此屬性;__getattr__(object,name[,default])
:獲得屬性值,如果不存在則返回默認值default ;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__
今天睡了一下午,還是舒服的!!!