1. 程式人生 > >Python第七周 學習筆記(2)

Python第七周 學習筆記(2)

學習筆記

面向對象
  • 類 class

    • 抽象概念
    • 是屬性與方法的集合
  • 對象/實例 instance/object

    • 類的具體實現/實例化
  • 屬性
    • 對象狀態的抽象,用數據結構描述
  • 操作/方法

    • 對象行為的抽象,用操作名和實現該操作的方法來描述
  • 一切皆對象
  • 對象是數據和操作的封裝
  • 對象是獨立的,但是對象之間可以互相作用
  • 目前OOP是最接近人類認知的編程範式

OOP三要素

封裝

  • 組裝:將數據和操作組裝到一起
  • 隱藏數據:對外只暴露一些接口,通過接口訪問對象

繼承

  • 復用
  • 少修改
  • OCP開閉原則 對擴展開放,對修改關閉

多態

  • 動態綁定

Python的類

  • 類名必須用大駝峰命名

類對象及類屬性

  • 類對象
    • 類定義會生成一個類對象
  • 類屬性

    • 類定義中的變量和類中定義的方法都是類屬性
  • 方法對象method 一般至少有一個參數self
  • self指代當前實例本身,類似Java的this

實例化

  • 在類對象名稱後面加上一個括號,即實例化
  • 一般情況下類可以生成多個實例
  • 每次實例化獲得的實例都是不同的,即使使用同樣的參數實例化
  • Python類實例化會先自動調用類或其超類內部的new方法,再調用init方法
  • 如果類沒有定義init,會隱式調用
  • init作用:對實例進行初始化,類似Java的構造器

    init方法不能有返回值,只能是None

實例對象

  • self.name name是保存在了實例上,並不是類上

實例變量和類變量

  • 實例變量是每一個實例自己的變量,是自己獨有的;類變量是類的變量,是類的所有實例共享的屬性和方法

特殊屬性

  • name 對象名
  • class 對象的類型
  • dict 對象的屬性的字典
  • qualname 類的限定名

    Python中每一種對象都擁有不同的屬性。函數、類都是對象,類的實例也是對象

實例屬性的查找順序

  • 實例使用.來訪問屬性,會先找自己的dict,如果沒有,通過屬性class找到自己的類,再去類的dict中找

一般來說。類變量使用全大寫命名

裝飾類

def add_name(name):
    def wrapper(value):
        value.NAME=name
        return value
    return wrapper

@add_name(‘a‘) # A=add_name(A)(‘a‘)
class A:
    AGE=8     

類方法和靜態方法

類方法

  • 在類定義中,使用@classmethod裝飾器修飾方法
  • 必須至少有一個參數,且第一個參數留給cls,cls指代調用者即類對象自身
  • cls這個標識符可以是任意合法名稱,但是為了易讀,不要修改
  • 通過cls可以直接操作類的屬性
  • 類似C++、Java中的靜態方法

靜態方法

  • 在類定義中,使用@staticmethod裝飾器修飾的方法
  • 調用時不會隱式傳入參數

調用方法

  • 類除了普通方法都可以調用,普通方法需要對象的實例作為第一參數
  • 實例可以調用所有類中定義的方法,普通方法傳入實例自身,靜態方法和類方法需要找到實例的類

訪問控制

私有屬性

  • 使用雙下劃線開頭的屬性名

    本質

  • 類定義的時候,如果聲明一個實例變量的時候,使用雙下劃線,Python解釋器會將其改名為_類名__變量名
  • 用此變量名仍可以訪問私有變量

保護變量

  • 變量名前使用一個下劃線
  • 只是開發者共同約定

私有變量

  • 參照私有變量、保護變量

屬性裝飾器

property裝飾器

  • 後面跟的函數名就是屬性名,其本身就是getter 必須存在

setter裝飾器

  • 接受self,與將要賦值的值。

deleter裝飾器

  • 控制是否刪除屬性,很少用

property裝飾器必須在前

寫法一

class Person:
    def __init__(self, name, age=18):
        self.name = name
        self.__age = age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        self.__age = age

    @age.deleter
    def age(self):
        print(‘del‘)

寫法二

class Person:
    def __init__(self, name, age=18):
        self.name = name
        self.__age = age

    def getage(self):
        return self.__age

    def setage(self, age):
        self.__age = age

    def delage(self):
        print(‘del‘)

    age = property(getage, setage, delage, ‘age property‘)

寫法三

class Person:
    def __init__(self, name, age=18):
        self.name = name
        self.__age = age

    age = property(lambda self: self.__age)

Python第七周 學習筆記(2)