面向對象進階-1
面向對象進階-1:
變量和屬性的聯系:
????變量(liang):存儲數(shu)據(ju)的容器??如(ru)name = ’gauohan‘
????屬(shu)性(xing)(xing):綁定到類或者對象(xiang)的變(bian)量,即有歸(gui)屬(shu)的變(bian)量 屬(shu)于誰的變(bian)量,那么這個變(bian)量叫(jiao)成誰的屬(shu)性(xing)(xing)
類的成員:
????1.字段( 屬性(xing)):
??????靜(jing)態字段:
????????類變(bian)量(類屬性,類字段):在類體中 但是在各個方(fang)法外
??????????調(diao)用:類(lei)名.變量(liang)名??實例對象.變量(liang)名
??????普通(tong)字段(duan):
????????實例變量(實例屬性,實例字(zi)段(duan)):在任(ren)意類方法內(nei)部以self.變量名的方式定義的變量
??????????調用:對象.變(bian)量名
??????局部變量:在類的函(han)數(shu)中,函(han)數(shu)執行完則被銷毀
????
?????2.方(fang)法:
??????綁定方法(實例(li)方法):
????????定義(yi)時:至少有一個self參數,誰(shui)調用(yong)此方法self就是(shi)誰(shui),self的值(zhi)python自(zi)動傳遞
????????調用:對象(xiang).方法()??無(wu)需(xu)傳self參數
??????靜態方法:??當方法中(zhong)不(bu)需要用到(dao)任何對象中(zhong)封裝的屬(shu)性和類(lei)中(zhong)的屬(shu)性,方法時定義一(yi)個靜態方法
????????用@staticmethod修(xiu)飾
????????定(ding)義(yi)時:可以(yi)有任意個參數,python不會對其進行任何參數的(de)傳遞
????????調用:類名.方(fang)法()??對象.方(fang)法()
????????價值:將全局中(zhong)零(ling)散的(de)函數統(tong)一寫(xie)到類中(zhong)方(fang)便可(ke)讀
靜態方法實例
#靜態方法
#實現計算2數和,判斷數是不是質數
class num:
@staticmethod
def add(a,b):
return a+b
@staticmethod
def look(n):
if n < 2:
return False
for i in range(2,int(n**2)+1):
if n%i==0:
return False
return True
print(num.add(1,2))
print(num.look(13))
??????類(lei)方法:??當方法中不需(xu)要用到對象封裝的(de)內容(rong),而是(shi)用當前(qian)類(lei) 則定(ding)義(yi)一(yi)個類(lei)方法
????????用(yong)@classmethod修飾(shi)
????????定(ding)義時(shi):至少有一個cls參數,此方法在哪個類中cls就是當前類名,cls的(de)值python自動傳遞
????????調用:類名.方法()??對象.方法()
類方法實例
#類方法
#實現動物類(含有創建動物實例方法,統計動物實例個數方法)
class Animal:
total_animals = 0 #類屬性
def __init__(self,name):
self.name = name
Animal.total_animals+=1 #調用類屬性 類名.屬性
@classmethod
def new_animal(cls,name): #創建動物類對象函數
return cls(name)
@classmethod
def count_animal(cls): #讀取類對象總數函數
print(f'{cls.total_animals}')
dog = Animal.new_animal('coke') #調用類方法 類名.方法
cat = Animal.new_animal('coke1')
Animal.count_animal()
????3.屬(shu)(shu)性(xing)的擴展:在面(mian)向對象編程中(zhong),“屬(shu)(shu)性(xing)的擴展”通常圍繞如何更靈活、安全地操作對象的屬(shu)(shu)性(xing)展開,核心是通過(guo)**裝飾器(如 Python 中(zhong)的 @property 、 @屬(shu)(shu)性(xing)名(ming).setter 、 @屬(shu)(shu)性(xing)名(ming).deleter )**來增強屬(shu)(shu)性(xing)的功能,實(shi)現對屬(shu)(shu)性(xing)訪(fang)問、修改(gai)、刪除的精(jing)細控(kong)制。
???????????讀??改 ??刪??(一般作用的是私有屬性)??????三者必須綁定在同一個方法名上才能工作(三者缺一不可)??

??????1.讀(du)取(qu)私(si)有屬性功能(neng)??基礎的(de)property
???????? 定義:在方法上加@property 將方法變成屬性??
???????? 使(shi)用情況:想要訪問私有(you)屬(shu)性(xing)(xing)??加上(shang)property后此(ci)方法(fa)變成屬(shu)性(xing)(xing)??則(ze)可以像普通屬(shu)性(xing)(xing)一樣直(zhi)接(jie)訪問此(ci)偽裝(zhuang)的(de)屬(shu)性(xing)(xing)從而間(jian)接(jie)訪問私有(you)屬(shu)性(xing)(xing)?? 此(ci)方法(fa)僅需(xu)有(you)一個self參數,無需(xu)而外(wai)參數??
#讀取私有屬性
class Foo:
def __init__(self,name):
self.__name = name #設置私有屬性,對象不能直接訪問
@property #將func方法偽裝成屬性其內部代碼正常執行不受影響
def func(self):
return self.__name
obj = Foo('guohan')
#obj.__name 私有屬性無法通過對象直接訪問
print(obj.func)
區別方法和屬性
方法:obj.func1()
屬性:obj.func2
??????2.修改私有屬(shu)性功能????由于proper將方(fang)法偽裝成屬(shu)性原來(lai)的方(fang)法名即稱為(wei)屬(shu)性名
????????定義:用@屬性名(被property修(xiu)飾的方法(fa)名).setter 裝飾一(yi)個同(tong)名方法(fa)
????????使用(yong)情況(kuang):修(xiu)改私有屬性的值
??????????這樣就(jiu)可(ke)以像改普通屬(shu)性一樣修改私有屬(shu)于????對象.屬(shu)性 = 值
#修改私有屬性
class Foo:
def __init__(self,name):
self.__name = name #設置私有屬性,對象不能直接訪問
@property
def func(self):
return self.__name
@func.setter
def func(self,value):
self.__name = value #滿足私有屬性只能在內部的公有方法進行操作
obj = Foo('guohan')
obj.func = 'gh'
print(obj.func)
??????3.刪(shan)除私有(you)屬(shu)性功能(neng)
????????定義:@屬性(xing)名.deleter
????????使用(yong)情況:刪除私有屬性
#刪除私有屬性
class Foo:
def __init__(self,name,pwd):
self.name = name #設置私有屬性,對象不能直接訪問
self.__pwd = pwd
@property
def func(self):
return self.__pwd
@func.setter
def func(self,value):
self.__pwd = value
@func.deleter
def func(self):
del self.__pwd
obj = Foo('guohan','123')
obj.func = 888
print(obj.name) #>>>guohan
print(obj.func) #>>>888
print(obj.__dict__) #>>>{'name': 'guohan', '_Foo__pwd': 888}
del obj.func
print(obj.__dict__) #>>>{'name': 'guohan'}
????????????核心總結:三者的關系是“1個核心+2個可選功能”
- 1個核心: @property (讀功能)是基礎,沒有它,setter和deleter就“沒地方綁”,根本用不了;
- 2個可選功能:setter(改)和deleter(刪)是附加在property上的,你可以按需加——比如只需要“讀和改”,就只加setter;只需要“讀”,就只保留基礎的property;
- 最終效果:對外,你操作的是 obj.func (像普通屬性);對內,實際走的是property、setter、deleter里的邏輯,既簡單又安全。
補充強制訪問:
# 強制訪問私有成員
class Foo:
def __init__(self,name):
self.__x = name
obj = Foo('alex')
print(obj._Foo__x) # 強制訪問私有實例變量