掉進懸崖的小白,學習python基礎第二週,面向對象編程,用類描述事物,學會封裝。用python編寫普通用戶類(登錄註冊)。

掉進懸崖的小白,學習python基礎第二週,面向對象編程,用類描述事物,學會封裝。用python編寫普通用戶類(登錄註冊)。

面向對象的概念

面向對象編程(Object Oriented Programming)簡稱OOP:
用認識一個系統的方式來分析、設計和實現一個系統。

面試答案:封裝、繼承和多態即爲面向對象

面向對象的方法包括:
面向對象的分析(OOA, Object-Oriented Analysis)
面向對象的設計(OOD, Object-Oriented Design)
面向對象的程序設計(OOP, Object-Oriented Program)

面向對象技術主要圍繞以下幾個概念:
對象、抽象數據類型、類、繼承性、多態性。

面向對象VS面向過程:相輔相成
面向過程:
先有算法,後有結構

面向對象:
先有結構,後有算法

面向對象的優點
可重用性(類)
可擴展性(繼承)
可管理性(接口)

OOP的四個基本機制
抽象
封裝
繼承與派生
多態性

類(class):一種複雜的自定義數據類型

類之重要:面向對象的核心

類的定義語法:
class <類名>(父類列表):
類變量…
初始化方法(self,對象的變量…)
類方法
靜態方法
屬性
成員方法/對象方法
析構方法

使用類的方式:和一般類型一致

(聲明->賦值->使用)

如何聲明:

對象引用 = 類名(構造中需要的實參)

使用:

通過對象引用來尋找對象的變量和方法
對象引用.對象的變量
對象引用.對象方法([參數列表])

對象的構造過程

1.爲對象開闢空間,使用__new__魔術方法;
2.調用初始化方法__init__初始化;
3.返回對象的引用。

類和對象的關係:

1.類是對象的模板
2.一個類可以創建多個對象
3.對象是類一個特定的個體
4.對象有獨立的內存空間,不會互相影響

初始化方法:

def init(self,[參數列表]):pass

self可以換成別的標識符,但帥的好看的人都用它
類特殊的魔法方法

作用:

爲對象注入初始的成員變量
初始化對象的成員變量

注意事項:

系統爲每個類自動提供一個默認的無參的初始化方法;
若自定義初始化方法,無參初始化方法不再提供.

self :對象方法中必備的第一個參數

聲明:初始化及每個對象方法必須寫,且必須爲第一參數

作用:
1.初始化或對象方法被調用時,立即自動指向調用該方法的對象,無需顯式傳參
2.區分同名的局部變量和對象變量

def init(self,name, age, pid):
self.name = name
self.age = age
self.pid = pid

析構方法:

聲明:
def del(self):
print(self,“將被釋放”)

使用:
程序中的對象有垃圾回收器(garbage collector)負責釋放,回收之前會自動調用對象對應類的析構方法,做釋放前的準備工作(關閉佔用資源等)。

注意事項:
1.一個類只有一個析構方法
2.除非特殊需要,通常被省略。

訪問級別

訪問級別的用處在於控制類的成員在哪些地方可以被訪問。

完全公開: 標識符不以_開始
保護(單下劃線前綴) :_標識符
私有(雙下劃線前綴) :__標識符

完全公開:任意位置均可訪問
保護:當前類及子類可訪問
私有:只能在當前類內訪問

xxx 系統預定義的名字,前後均有一個“雙下劃線” 代表python裏魔法方法專用的標識,如 init ()代表類的初始化方法。

封裝(行爲(方法)和字段(數據)的結合)

封裝的含義:將字段(數據成員)和行爲(代碼成員)相組合的一種機制。

目的:*
1.控制對象狀態的範圍
2.加強對象自身的內聯(聯動)性
3.便於外部使用

封裝的基本要求:

特定邊界:所有的內部變化都限制在此邊界內(類內部);
特定訪問權限:在對象外部不能訪問或修改受保護的內部實現細節(__成員)
有外部接口(set/get方法):此對象利用它與其它對象發生關聯

例:銀行的取錢方案等

使用屬性裝飾器來完成封裝:

class Person:
    @property
    def gender(self):
        return self.__gender

    @gender.setter
    def gender(self, gender):
        if gender == "男" or gender == "女":
            self.__gender = gender
            return
        print("must be 男 or 女")

    @gender.deleter
    def gender(self):
        del self.__gender


per1 = Person()
per1.gender = "男"
print(per1.gender)
per1.gender = "獸"
print(per1.gender)

主要用於快速構建代碼:
prop+回車:生成只讀屬性
props+回車:生成可讀寫屬性
propsd+回車:生成可讀寫刪屬性

定義一個普通用戶類

普通用戶類具備的屬性:用戶名、密碼、權限

普通用戶類具備的方法:登錄、註冊

# 注意:請詳細測試該類
# 對象列表
# 數據庫對應的對象列表
# [1,2,3,4]
# ["1","3"]
# 對象放入列表
class User:

    def __init__(self, user_name, password, pri) -> None:
        super().__init__()
        self.user_name = user_name
        self.password = password
        self.pri = pri

    def login(self, user_name, password):
        return self.user_name == user_name and self.password == password

    def register(self, user_name, password, pri):
        self.user_name = user_name
        self.password = password
        self.pri = pri


# 準備數據庫中的對象列表
users = \
    [
        User("admin", "123", "admin"),
        User("user1", "123", "user"),
        User("user2", "123", "user"),
        User("user3", "123", "user"),
        User("g1", "123", "guest"),
    ]
# 模擬前端驗證
# 登錄的效果
# for j in range(3):
#     user_name = input("用戶名:")
#     password = input("密  碼:")
#     # 去挨個匹配數據庫中的對象 是否有對象匹配上
#     # 保持登錄用戶的變量
#     login_user = None
#     for i in range(len(users)):
#         if users[i].login(user_name,password):
#             print("登錄成功")
#             login_user = users[i]
#             break
#     else:
#         print("用戶名或密碼錯誤!" if j != 2 else "24小時內無法再次登錄!")
#
#     if login_user is not None:
#         break

# 模擬前端的註冊
# 註冊的效果
# 問用戶要信息
register_user = User(None, None, None)
user_name = input("註冊用戶名:")
while 1:
    password = input("註冊密碼:")
    re_password = input("重複密碼:")
    if password != re_password:
        print("兩次輸入不一致 請重新輸入!")
        continue
    break
# 產生用戶對象
register_user.register(user_name, password, "admin")
# 對象存入數據庫
users.append(register_user)

# 遍歷數據庫 驗證是否註冊完畢
for i in range(len(users)):
    print(f"用戶名:{users[i].user_name} 密碼:{users[i].password} 權限:{users[i].pri}")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章