Day13,

一、對象屬性與類屬性

1. 類屬性:在類中的(非方法里)屬性屬於類屬性(用類名來調用)

對象屬性: 對象名.屬性名

def __init__(self): self.屬性名 = 屬性值

2. 對象屬性:在方法中的屬性屬於對象屬性(用對象來調用)

類屬性: 類名.屬性

class Student: all_list = [ ] # 類的屬性 def __init__(self, name) self.name = name # self.name 對象屬性

3. 優先順序比較:對象屬性高於類屬性

注意: 當刪除了對象中的屬性時, 再次調用會調用同名的類屬性

當對象屬性和類屬性重名的時候, 對象屬性會屏蔽掉類屬性, 只有刪除掉對象屬性之後才能再次使用該類屬性

在使用類時:

stu = Student(Aliase)print(stu.name) # 訪問對象屬性print(Student.all_list) # 訪問類的屬性print(stu.all_list) # 對象名能否訪問類的屬性?可以的

4. 類屬性和對象屬性的區別:

類的屬性(方法), 對象可訪問;對象的屬性(方法), 類不能訪問。

二、類方法和靜態方法

1. 實例方法、類方法、靜態方法

1)類方法與類的實例方法不同, 類的實例方法即是在類實例化後,通過類對象調用的

2)類的實例可以調用類方法和靜態方法、類屬性和對象屬性

3)類方法,只能調用類的屬性

4)靜態方法,只能由類來調用,且不能訪問類屬性和對象屬性

2. 類方法:在類的內部 , 通過 @classmethod 裝飾的方法,即是類的方法,類的方法中第一個參數是cls,cls表示為當前類,等同於self.cls,同類名一樣 。如訪問類的屬性, cls.屬性名。

class Stu: name = Stu.class @classmethod def print(cls): print(cls.__name__) name = gogo--haha-- print(name)s = Stu()print(s.name)s.print()Stu.print() # 可以直接以「類名.類方法」方式調用

3. 靜態方法:不能訪問一切除靜態方法之外的類屬性方法和對象屬性方法,可以被對象和類訪問。@staticmethod裝飾的方法,方法參數只是局部變數,不能有cls和self。

class Stu: name = Stu.class @staticmethod def print(): # print(name) print(靜態方法不能訪問類屬性) # 對象、類名方式都可以調用s = Stu()print(s.name)s.print()Stu.print()

三、 對象的創建

類名(初始化參數) : Stu(), 在內存的堆中開闢一塊內存區域(鏈表結構), 創建對象之後,返回對象所在內存區域的首地址。對於返回的首地址,可以賦給一個變數,這個變數就變成了對象的引用。通過對象的引用可以訪問對象的屬性和方法。 創建對象時, 默認調用類的構造方法__init__(self)。

四、對象的銷毀

1)del 對象引用名, 刪除對象引用指向的內存區域, 默認會調用類的析構方法__del__(self)

2)如果刪除的對象中存在其它引用,則不會刪除內存區域。

五、動態添加方法

from types import MethodTypeclass Person: # 為了限制動態添加的屬性範圍,則使用類的屬性:__slots__,() __slots__ = (name , age, _Person__sex, _Person__money,up) # 可動態添加的屬性名和方法名 def __init__(self, name): self.name = name self.__sex = M @property def sex(self): print(判斷是否有許可權) return self.__sex @sex.setter def sex(self, sex): if sex in (M,W): self.__sex = sex else: print(人妖!) def speak(self, txt): print({0} 說:{1}.format(self.name, txt))def up(self): print(--up--+self.name)if __name__ == __main__: person = Person(小魚) person.speak(你多大了!) person.age = 20 print({0} age :{1}.format(person.name, person.age)) #person.sex = woman # age,sex 動態添加屬性 #person.money = 1.5 #print(person.__dict__) # 當類中聲明了__slots__之後,__dict__被替換,無法調用 print(person.__slots__) # person.height = 190 person.up = MethodType(up, person) # 第一個參數是函數名,第二個參數是調用此函數的對象 person.up() person.sex = MW person.sex = woman person.sex = M print(person.sex) # 私有屬性不能直接訪問

注意:_slots_ 用來限制動態添加的屬性,定義的屬性僅對當前類起作用,對繼承的之類是不起作用的。

可以通過 from types import MethodType 來動態添加方法,但是給一個實例綁定的方法,對另一個實例是不起作用的。給所有實例都綁定方法,可以給class綁定方法

Person.up = MethodType(up, Person) # 給類動態添加方法

六、作業

  1. 簡易版CS射擊遊戲


推薦閱讀:

Python函數中*和**的內涵究竟是什麼呢?
為什麼Python第三方庫的document看起來很統一?
python3.6 安裝後沒有pip?
python進階中,關於買書的問題!?
python中如何理解裝飾器代碼?

TAG:Python | Python3x | 人工智慧 |