中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

面向對象進階-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)制。

???????????讀??改 ??刪??(一般作用的是私有屬性)??????三者必須綁定在同一個方法名上才能工作(三者缺一不可)??

image

 

??????1.讀(du)取(qu)私(si)有屬性功能(neng)??基礎的(de)property&nbsp;

???????? 定義:在方法上加@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) # 強制訪問私有實例變量

 

posted @ 2025-10-14 22:57  guohan  閱讀(22)  評論(0)    收藏  舉報