oop 多態

概念 :

一種事物具有多種屬性

好比:  水 有 氣態  固態  液態

官方解釋:多個不一樣類的對象能夠響應一個方法,產生不一樣的結果

首先強調 多態不是一種特殊的語法   就是一種一種狀態而已 或者特性(即多個不一樣的對象能夠響應同一個方法,產生不一樣的結果

即多個對象有相同的使用方法,

  好處

  對於 使用者而言,大大的下降了使用的難度python

  咱們以前寫的usb接口,下的鼠標 鍵盤 就屬於多態網絡

實現多態:

抽象類   或者鴨子類均可以寫出具有多態的代碼,最簡單的就是鴨子類型函數

要管理  雞 鴨 鵝

如何 能最簡便的管理 就是咱們說一句  他們都能理解 都知道要要幹什麼oop

即 他們擁有相同的 方法測試

class Ji:
    def xiadan(self):
        print("夏季但")

class E:
    def xiadan(self):
        print("夏爾丹")
class Ya:
    def xiadan(self):
        print("下壓但")

j = Ji()
e  =E()
y = Ya()
j.xiadan()

def xia (obj):
    obj.xiadan()
xia(j)
xia(e)
xia(y)

他們相同的就是   會下蛋   利用鴨子 直接調用優化

 

 oop  相關的內置函數spa

1, isinstance    code

判斷一個對象是不是某一類的實例對象

參數1要判斷的對象blog

參數2  要判斷的類型

 

2issubclass

判斷一個類是否是另外一個類的子類

參數1 是子類

參數2是父類

class Animal:

    def eat(self):
        print("動物得吃東西...")

class Pig(Animal):
    def  eat(self):
        print("豬得吃 豬食....")


class Tree:
    def light(self):
        print("植物光合做用....")

pig = Pig()
t = Tree() def manage(obj):     if issubclass(type(obj),obj):         obj.eat()     else:         print("不是一頭動物!") manage(pig) manage(t)

 print(issubclass(Tree,object))


# str

```python
__str__ 會在對象被轉換爲字符串時,轉換的結果就是這個函數的返回值
使用場景:咱們能夠利用該函數來自定義,對象的是打印格式
```

## del

```python
執行時機: 手動刪除對象時立馬執行,或是程序運行結束時也會自動執行
使用場景:當你的對象在使用過程當中,打開了不屬於解釋器的資源:例如文件,網絡端口

```

```python

# del使用案例

# class FileTool:
# """該類用於簡化文件的讀寫操做 """
#
# def __init__(self,path):
# self.file = open(path,"rt",encoding="utf-8")
# self.a = 100
#
# def read(self):
# return self.file.read()
#
# # 在這裏能夠肯定一個事,這個對象確定不使用了 因此能夠放心的關閉問文件了
# def __del__(self):
# self.file.close()
#
#
# tool = FileTool("a.txt")
# print(tool.read())

```

## call

```python
執行時機:在調用對象時自動執行,(既對象加括號)
```

測試:

```python
#call 的執行時機
class A:
def __call__(self, *args, **kwargs):
print("call run")
print(args)
print(kwargs)

a = A()
a(1,a=100)
```

## slots

```python
該屬性是一個類屬性,用於優化對象內存佔用
優化的原理,將本來不固定的屬性數量,變得固定了
這樣的解釋器就不會爲這個對象建立名稱空間,因此__dict__也沒了
從而達到減小內存開銷的效果

另外當類中出現了slots時將致使這個類的對象沒法在添加新的屬性
```

```python
# slots的使用
class Person:

__slots__ = ["name"]
def __init__(self,name):
self.name = name

p = Person("jck")

# 查看內存佔用
# print(sys.getsizeof(p))
# p.age = 20 # 沒法添加

# dict 沒有了
print(p.__dict__)
```

 

# getattr setattr delattr

```python
getattr 用點訪問屬性的時若是屬性不存在時執行
setattr 用點設置屬性時
delattr 用del 對象.屬性 刪除屬性時 執行


這幾個函數反映了 python解釋器是如何實現 用點來訪問屬性

getattribute 該函數也是用來獲取屬性
在獲取屬性時若是存在getattribute則先執行該函數,若是沒有拿到屬性則繼續調用 getattr函數,若是拿到了則直接返回
```

.

# [] 的實原理

## getitem setitem delitem

任何的符號 都會被解釋器解釋成特殊含義 ,例如 . [] ()

```python
getitem 當你用中括號去獲取屬性時 執行
setitem 當你用中括號去設置屬性時 執行
delitem 當你用中括號去刪除屬性時 執行
```

 

# 運算符重載

當咱們在使用某個符號時,python解釋器都會爲這個符號定義一個含義,同時調用對應的處理函數, 當咱們須要自定義對象的比較規則時,就可在子類中覆蓋 大於 等於 等一系列方法....

案例:

本來自定義對象沒法直接使用大於小於來進行比較 ,咱們可自定義運算符來實現,讓自定義對象也支持比較運算符

```python
class Student(object):
def __init__(self,name,height,age):
self.name = name
self.height = height
self.age = age

def __gt__(self, other):
# print(self)
# print(other)
# print("__gt__")
return self.height > other.height

def __lt__(self, other):
return self.height < other.height

def __eq__(self, other):
if self.name == other.name and self.age == other.age and self.height == other.height:
return True
return False

stu1 = Student("jack",180,28)
stu2 = Student("jack",180,28)
# print(stu1 < stu2)
print(stu1 == stu2)
```

上述代碼中,other指的是另外一個參與比較的對象,

大於和小於只要實現一個便可,符號若是不一樣 解釋器會自動交換兩個對象的位置

 

 

 

# 迭代器協議

```python
迭代器是指具備__iter__和__next__的對象
咱們能夠爲對象增長這兩個方法來讓對象變成一個迭代器

```

案例:

```python
class MyRange:

def __init__(self,start,end,step):
self.start = start
self.end = end
self.step = step

def __iter__(self):
return self

def __next__(self):
a = self.start
self.start += self.step
if a < self.end:
return a
else:
raise StopIteration

for i in MyRange(1,10,2):
print(i)

```

 

### 上下文管理

上下文 context

這個概念屬於語言學科,指的是一段話的意義,要參考當前的場景,既上下文

在python中,上下文能夠理解爲是一個代碼區間,一個範圍 ,例如with open 打開的文件僅在這個上下文中有效

 

涉及到的兩個方法:

## enter

​ 表示進入上下文,(進入某個場景 了)

## exit

表示退出上下文,(退出某個場景 了)

 

當執行with 語句時,會先執行enter ,

當代碼執行完畢後執行exit,或者代碼遇到了異常會當即執行exit,並傳入錯誤信息

包含錯誤的類型.錯誤的信息.錯誤的追蹤信息

注意:

```pythonenter 函數應該返回對象本身 exit函數 能夠有返回值,是一個bool類型,用於表示異常是否被處理,僅在上下文中出現異常有用若是爲True 則意味着,異常以及被處理了 False,異常未被處理,程序將中斷報錯

相關文章
相關標籤/搜索