10-python基礎知識-面向物件
阿新 • • 發佈:2018-12-28
面向物件
面向物件
- 與面向過程對比
- 面向過程:數學邏輯的對映,學會做個好員工
- 面向物件:生活邏輯的對映,學會做個好領導
- 生活例項
- 類: 人 手機 電腦
- 物件: 小明、老王 你的手機、我的手機 我的電腦、你的電腦
- 官方定義
- 類:具有相同特徵(屬性和行為)事物的抽象
- 物件:某個類的具象
- 程式語言
- 類:是一種自定義的資料型別
- 物件:某個類型別的變數
基礎語法
-
類的定義
class 類名: pass
-
使用說明:
- 定義類的關鍵字是
class
- 類名:原則上符合識別符號命名規範即可,但是通常都採用大駝峰風格命名,如:
UserName
- 類名後不要忘記’:’
- 類的內容要進行整體縮排
- 屬性可以通過變數體現,行為通過函式體現
- 成員訪問:
- 屬性:物件.屬性名
- 方法:物件.方法名()
- 示例:
# 定義類 class Person: # 行為通過函式體現 # 吃飯 def eat(self):
- 定義類的關鍵字是
-
self使用
class Person: def run(self): # self表示當前物件,就是呼叫該方法的物件
-
__str__
方法class Person: # 列印物件時預設列印:類名+地址 # 重寫該方法,列印物件時會列印該方法的返回值 # 該方法必須返回一個字串 # 使用str方法強制型別轉換時也會呼叫該方法 def __str__(self): return '我是{},今年{}歲'.format(self.name, self.age) p = Person() p.name = '勒布朗.詹姆斯' p.age = 34 print(p) s = str(p) print(s)
-
__init__
方法class Cat: def __str__(self): return 'name:{},age:{},color:{}'.format(self.name, self.age, self.color) # 構造方法:建立物件後會自動呼叫,可以進行初始化設定 def __init__(self, name, age, color): # print('__init__') self.name = name self.age = age self.color = color # 這種方式比較繁瑣 # jiafei = Cat() # jiafei.name = '加菲' # jiafei.age = 2 # jiafei.color = '橘黃色' # print(jiafei) jiafei = Cat('加菲', 2, '橘黃色') print(jiafei)
-
__del__
方法class Pig: # 析構方法:當物件釋放時,系統會自動呼叫 # 該方法一般做資源釋放操作,如:斷開資料庫連線、檔案關閉 def __del__(self): print('大師兄,我不行了') bajie = Pig() del bajie print('八戒,一路走好!')
-
思考:小明手裡有兩張牌,左手♥K,右手♠A,小明交換兩手的牌後,手裡分別是什麼?
- 先找到物件:♥K、♠A、左手、右手、小明
- 根據物件抽象類:人、手、牌
- 設計相關的類,需要根據功能反覆完善
常用內建函式
-
內建函式:在類中,特定的時刻會自動觸發的函式
-
__init__、__del__、__str__
-
__setattr__、__getattr__、__delattr__
class Person: def __init__(self, name): self.name = name # print('初始化物件') # 當設定屬性時會自動呼叫 def __setattr__(self, key, value): # print(key, value) self.__dict__[key] = value # 當獲取不存在的屬性時會自動觸發 def __getattr__(self, item): if item == 'age': return 18 else: return '你猜' # 銷燬物件的指定屬性時會自動觸發 def __delattr__(self, item): print(item, '屬性即將銷燬') xiaoming = Person('小明') # xiaoming.name = '小明' print(xiaoming.age) print(xiaoming.height) print(xiaoming.__dict__) del xiaoming.name print('over')
-
__setitem__、__getitem__、__delitem__
class Person: # 將物件當做字典操作,新增或設定屬性時自動觸發 def __setitem__(self, key, value): # print(key, value) self.__dict__[key] = value # 將物件當做字典操作,根據鍵獲取值時會自動觸發 def __getitem__(self, item): # print(item) return self.__dict__.get(item) # 將物件當做字典操作,根據鍵銷燬屬性時會自動觸發 def __delitem__(self, key): print(key, '屬性即將銷燬') del self.__dict__[key] xiaoming = Person() # xiaoming.name = '小明' # print(xiaoming.name) xiaoming['name'] = '小明' print(xiaoming['name']) del xiaoming['name'] print(xiaoming['name'])
-
__call__
class Person: # 將物件當做函式呼叫,該方法會自動觸發 def __call__(self, *args, **kwargs): # print('__call__', args) return sum(args) p = Person() # 將物件當做函式呼叫,必須重寫類的call方法 ret = p(1, 2, 3) print(ret) def test(): pass # 判斷一個物件是否可以呼叫 print(callable(p)) print(callable(test)) # 判斷一個物件是否是函式 from inspect import isfunction print(isfunction(p)) print(isfunction(test)) # 判斷物件是否擁有指定屬性,若物件可以呼叫,那麼一定擁有__call__屬性 print(hasattr(p, '__call__')) print(hasattr(test, '__call__'))