1、封裝、繼承、多型
- 封裝
- __屬性名 == _類名__屬性名
封裝資料:內部直接訪問、外部通過介面訪問 封裝方法:隔離復雜度,提高可擴展性
- __屬性名 == _類名__屬性名
- 繼承
- 繼承關系:
貓 是 動物
- 派生
python2:
super(子類,self).父類方法()python3:super().父類方法()對于super(B,self).方法f(),先看self是誰的實體,假如是A類,則列出A類的mro串列,再找到mro串列中B類的位置,然后從B類的下一個類開始查找方法f - 組合關系
學生 有 課程
- 抽象類
abc模塊 只能被繼承,不能被實體化 子類必須繼承抽象類的方法
- 繼承關系:
- 多型性
- python提倡鴨子型別
即屬性看起來像就行,不需要繼承抽象類來約束屬性
- python提倡鴨子型別
2、系結方法、非系結方法
- 系結到物件
- 無裝飾器
呼叫者:物件(自動傳參self物件)、類(手動傳參self物件)
- 無裝飾器
- 系結到類
- @classmethod
呼叫者:類、物件(自動傳參cls類)
- @classmethod
- 非系結方法
- @staticmethod
呼叫者:類、物件(手動傳參)
- @staticmethod
3、反射
- 通過字串訪問屬性
hasattr(類/物件,'屬性名'))getattr(類/物件,'屬性名',None))setattr(類/物件,'屬性名',值)delattr(類/物件,'屬性名')
4、元類
定義類的兩種方法
class 類名(基類元組):
class A(object, metaclass=type): def __init__(self, name): self.name = name類名 = type(類名,基類元組,名稱空間字典)
class_name = 'A' class_bases = (object,) class_dict = {} class_body = """ def __init__(self, name): self.name = name """ exec(class_body, globals(), class_dict) A = type(class_name, class_bases, class_dict)實體化
# 自定義元類 class MyMeta(type): def __init__(cls, class_name, class_bases, class_dict): super(MyMeta, cls).__init__(class_name, class_bases, class_dict) cls.__instance = None # 單例 def __call__(cls, *args, **kwargs): if not cls.__instance: # 1、創建obj obj = object.__new__(cls) # 2、初始化obj cls.__init__(obj, *args, **kwargs) # 單例 cls.__instance = obj # 3、回傳obj return cls.__instance # A = MyMeta(class_name, class_bases, class_dict) class A(object, metaclass=MyMeta): # 2、初始化obj def __init__(self, name): self.name = name a = A('小明') # a = A.__call__('小明')
5、內置方法
__dict__物件呼叫:物件內的所有資料屬性 類呼叫:類內的所有資料屬性和函式屬性
__bases__類呼叫:查看類的直系父類
類名.mro()列出所有父類繼承屬性查詢順序
def __getitem__(self, item):呼叫方式:物件['屬性']
def __setitem__(self, key, value):呼叫方式:物件['屬性'] = 值
def __delitem__(self, key):呼叫方式:del 物件['屬性']
def __getattr__(self, item):呼叫方式:物件.屬性
def __setattr__(self, key, value):呼叫方式:物件.屬性 = 值
def __delattr__(self, key):呼叫方式:del 物件.屬性
def __str__(self):return 'str'呼叫方式:str(物件)
def __del__(self):呼叫方式:物件回收時
def __call__(self, *args, **kwargs):呼叫方式:類()/物件()
6、描述符
- @property
呼叫方式:物件.方法名
- @方法名.setter
呼叫方式:物件.方法名 = 值
- @方法名.deleter
呼叫方式:del 物件.方法名
__get____set____delete__
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/33668.html
標籤:Python
