面向對象進階-1
面向對象進階-1:
變量和屬性的聯系:
????變量:存儲數據的容器??如name = ’gauohan‘
????屬性:綁定到類或者對象的變量,即有歸屬的變量 屬于誰的變量,那么這個變量叫成誰的屬性
類的成員:
????1.字段( 屬性):
??????靜態字段:
????????類變量(類屬性,類字段):在類體中 但是在各個方法外
??????????調用:類名.變量名??實例對象.變量名
??????普通字段:
????????實例變量(實例屬性,實例字段):在任意類方法內部以self.變量名的方式定義的變量
??????????調用:對象.變量名
??????局部變量:在類的函數中,函數執行完則被銷毀
????
?????2.方法:
??????綁定方法(實例方法):
????????定義時:至少有一個self參數,誰調用此方法self就是誰,self的值python自動傳遞
????????調用:對象.方法()??無需傳self參數
??????靜態方法:??當方法中不需要用到任何對象中封裝的屬性和類中的屬性,方法時定義一個靜態方法
????????用@staticmethod修飾
????????定義時:可以有任意個參數,python不會對其進行任何參數的傳遞
????????調用:類名.方法()??對象.方法()
????????價值:將全局中零散的函數統一寫到類中方便可讀
靜態方法實例
#靜態方法
#實現計算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))
??????類方法:??當方法中不需要用到對象封裝的內容,而是用當前類 則定義一個類方法
????????用@classmethod修飾
????????定義時:至少有一個cls參數,此方法在哪個類中cls就是當前類名,cls的值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.屬性的擴展:在面向對象編程中,“屬性的擴展”通常圍繞如何更靈活、安全地操作對象的屬性展開,核心是通過**裝飾器(如 Python 中的 @property 、 @屬性名.setter 、 @屬性名.deleter )**來增強屬性的功能,實現對屬性訪問、修改、刪除的精細控制。
???????????讀??改 ??刪??(一般作用的是私有屬性)??????三者必須綁定在同一個方法名上才能工作(三者缺一不可)??

??????1.讀取私有屬性功能??基礎的property
???????? 定義:在方法上加@property 將方法變成屬性??
???????? 使用情況:想要訪問私有屬性??加上property后此方法變成屬性??則可以像普通屬性一樣直接訪問此偽裝的屬性從而間接訪問私有屬性?? 此方法僅需有一個self參數,無需而外參數??
#讀取私有屬性
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.修改私有屬性功能????由于proper將方法偽裝成屬性原來的方法名即稱為屬性名
????????定義:用@屬性名(被property修飾的方法名).setter 裝飾一個同名方法
????????使用情況:修改私有屬性的值
??????????這樣就可以像改普通屬性一樣修改私有屬于????對象.屬性 = 值
#修改私有屬性
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.刪除私有屬性功能
????????定義:@屬性名.deleter
????????使用情況:刪除私有屬性
#刪除私有屬性
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) # 強制訪問私有實例變量
浙公網安備 33010602011771號