- 面向對象是一種程式設計方式,此程式設計方式的實作是基于對 類 和 對象 的使用
- 類 是一個模闆,模闆中包裝了多個“函數”供使用(可以講多函數中公用的變量封裝到對象中)
- 對象,根據模闆建立的執行個體(即:對象),執行個體用于調用被包裝在類中的函數
- 面向對象三大特性:封裝、繼承和多态
類的成員
類的成員可以分為三大類:字段、方法和屬性
注:所有成員中,隻有普通字段的内容儲存對象中,即:根據此類建立了多少對象,在記憶體中就有多少個普通字段。而其他的成員,則都是儲存在類中,即:無論對象的多少,在記憶體中隻建立一份。
一、字段
字段包括:普通字段和靜态字段,他們在定義和使用中有所差別,而最本質的差別是記憶體中儲存的位置不同,
- 普通字段屬于對象
- 靜态字段屬于類
class Proice:
#靜态字段
country = "中國"
def __init__(self,name):
#普通字段
self.name = name
ret = Proice("山西")
print(ret.name) #直接通路普通字段
print(ret.country) #直接通路靜态字段
View Code
應用場景: 通過類建立對象時,如果每個對象都具有相同的字段,那麼就使用靜态字段
二、方法
方法包括:普通方法、靜态方法和類方法,三種方法在記憶體中都歸屬于類,差別在于調用方式不同。
- 普通方法:由對象調用;至少一個self參數;執行普通方法時,自動将調用該方法的對象指派給self;
- 類方法:由類調用; 至少一個cls參數;執行類方法時,自動将調用該方法的類複制給cls;
- 靜态方法:由類調用;無預設參數;
class Paric:
def func(self):
#普通方法
print("name")
@classmethod
#類方法 最少有一個參數
def xxoo(cls,arg1,arg2):
print(arg1,arg2)
#靜态方法 可也加參數也可以不加參數
@staticmethod
def xo():
print("xo")
ret = Paric() #建立對象
ret.func() #對象調用普通方法
Paric.xxoo(1,2) #類調用類方法
Paric.xo() #類調用靜态方法
三、屬性
如果你已經了解Python類中的方法,那麼屬性就非常簡單了,因為Python中的屬性其實是普通方法的變種。
對于屬性,有以下三個知識點:
- 屬性的基本使用
- 屬性的兩種定義方式
- 調用時,無需括号
class Foo:
def __init__(self,name):
self.name = name
#擷取
@property
def func(self):
temp = self.name
return temp
#設定
@func.setter
def func(self,value):
self.name = value
#調用
@func.deleter
def func(self):
del self.name
ret = Foo("Wyc")
r = ret.func #擷取
print(r)
del ret.func #删除
ret.func = "nihao" #設定
靜态字段方式,建立值為country對象的靜态字段
class Foo:
#靜态字段
country ="中國"
def func(self):
print("11")
#類調用靜态方法
print(Foo.country)
類成員的修飾符
類的所有成員在上一步驟中已經做了詳細的介紹,對于每一個類的成員而言都有兩種形式:
- 公有成員,在任何地方都能通路
- 私有成員,隻有在類的内部才能使用方法
私有成員和公有成員的定義不同:私有成員命名時,前兩個字元是下劃線。(特殊成員除外,例如:__init__、__call__、__dict__等)
class Foo:
#私有字段
__yer = "Wyc"
def func(self):
#用類調用私有字段,隻能在内部調用。
print(Foo.__yer)
ret = Foo()
ret.func()
class Foo:
#公有靜态字段
name = "中國"
def func(self):
pass
#公有靜态字段由類調用
print(Foo.name)
類的特殊成員
__doc__
表示類的描述資訊
class Foo:
"""
這是__doc__的方法
"""
def func(self):
pass
#由類直接調用,類的注釋
print(Foo.__doc__)
class Foo:
#構造方法,簡稱封裝
def __init__(self):
self.name = "wyc"
def func(self):
print(self.name)
ret = Foo()
ret.func()
__call__
對象後面加括号,觸發執行。
class Foo:
def func(self):
pass
def __call__(self, *args, **kwargs):
print("123")
ret = Foo()
ret() #對象後邊加括号自動觸發__call__方法
__dict__
類或對象中的所有成員
class Foo:
def func(self):
pass
ret = Foo.__dict__ #檢視類或對象中的所有成員
print(ret)
__str__
如果一個類中定義了__str__方法,那麼在列印 對象 時,預設輸出該方法的傳回值。
class Foo:
#預設輸出該↓方法的預設值
def __str__(self):
return "Wyc"
ret = Foo()
print(ret)
__getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分别表示擷取、設定、删除資料
class Foo:
def __setitem__(self,key,value):
print(key,value)
r = Foo()
r["xxx"] = 123
#對象後邊加中括号就會執行__setitem__方法,一個key,一個value
class Foo:
def __delitem__(self,key):
print(key)
r = Foo()
del r["xxx"] #執行__delitem__方法,删除key
class Foo:
def __getitem__(self, item):
print(item)
r = Foo()
r["123456"]
#對象後邊加個中括号就會自動執行
__iter__
用于疊代器,之是以清單、字典、元組可以進行for循環,是因為類型内部定義了 __iter_
class Foo(object):
def __init__(self,sq):
self.sq = sq
def __iter__(self):
return iter(self.sq)
obj = Foo([11,22,33,44,55])
for i in obj:
print(i)
總結:
成員:
字段 靜态字段(每個對象都有一份),普通字段(每個對象都有不同的資料)
方法 靜态方法(無需使用對象封裝的内容),類方法,普通方法(使用對象中的資料)
特性 普通特性(将方法僞造成字段)
如何快速判斷,類執行,或者對象執行:
有self的對象調用
無self的,類調用