python 高級編程與異步IO併發編程(三)深刻類和對象

1 鴨子類型和多態

維基百科:當看到一隻鳥走起來像鴨子,游泳起來像鴨子,叫起來也像鴨子,那麼這隻鳥就能夠被稱爲鴨子java

class Cat(object):
    def say(self):
        print('i am a cat')
class Dog(object):
    def say(self):
        print('i am a dog')
class Duck(object):
    def say(self):
        print('i am a duck')

#animal=Cat
#animal().say()

#只須要共同實現say()方法就能夠了
animal_list=[Cat,Dog.Duck]
    for animal in animal_list:
        animal().say()
a = ["today1","today2"]
b = ["today2","today"]
name_tuple = ["bobay3","bobay4"]
name_set = set()
name_set.add("today5")
name_set.add("today6")
a.extend(b)
print(a)

複製代碼

2 抽象基類(abc模塊) - 1

抽象基類(abstract base class)相似java中的接口python

3 抽象基類(abc模塊) - 2

class Company(object):
    def __init__(self,employee_list):
        self.employee=employee_list
        
    def __len__(self):
        return len(self.employee)
    
com=Company("today1","today2")
print(hasattr(com,"__len__"))
print(len(com))
複製代碼

#咱們但願在某些狀況之下斷定某個對象的類型web

from collections.abc import Sized
is instance(com,Sized)
複製代碼

#咱們須要強制某個子類須要實現某些方法redis

#實現了一個web框架,集成cache(redis,cache,memerychache)django

#須要設計一個抽象基類,指定子類必須實現某些方法bash

#如何去模擬一個抽象基類框架

import abc
class CacheBase(metac)
class CacheBase():
    def get(self,key)
        raise NotImplementedError
    def set(self,key,value):
        raise NotImplementedError
        
class RedisCache(CacheBase):
    pass
    
from collections.abc import *
class CacheBase(metaclass=abc.ABCMeta):
    @abc.abstractmethord
    def get(self,key):
        pass
    @abc.abstractmethord
    def set(self,key,value):
        rasie
class RedisCache(CacheBase): 
        pass
redis_cache=RedisCache()
複製代碼

4 isinstance和type的區別

class A:
    pass
class B(A):
    pass

print(isinstance(b,B))
print(isinstance(b,A))

print(type(b) is A )
print(type(b) is B)
#儘可能使用isinstance去判斷類型,type主要是判斷兩個的值是否相等 
複製代碼

5 類變量和實例變量

class A:
    aa=1
    #self是類的實例
    def __init__(self,x,y):
        self.x=x
        self.y=y
a=A(2,3)
print(a.x,a.y,a.aa)
A.aa=11
a.aa=100
print(a.x,a.y,a.aa)
print(a.aa)

b=A(3,5)
print(b.aa)
#先查找實例變量,而後查找類變量
複製代碼

####6 類和實例屬性的查找順序—mro查找函數

class A:
    name="A"
    def __init__(self):
        self.name="obj"

a=A()
print(a.name)
#新式類
class D:
    pass
class C(D):
    pass
class B(D):
    pass
class A(B,C):
    pass
print(A.__mro__)
複製代碼

7 類方法、靜態方法和實例方法

class Date:
    #構造函數
    def __init__(self,,year,month,day):
        self.year=year
        seif.month=month
        self.day=day
        
    def __str__(self):
        return "{year}/{month}/{day}".format(year=self.year,month=self.month,day=self.day)
if __name++=="__main__":
    new_day=Date(2019,9,02)
    print(new_day)
#2019-09-02
data_str ="2019-9-02"
year,month,day=tuple(data_str,split("-"))
new_day=Date(int(year),int(month),int(day))
print(new_day)
####
複製代碼

8 數據封裝和私有屬性

class User:
    def __init__(self,birthday):
        self.birthday =  birthday 

    def get_age(self):
        #返回年齡
        return 2018-self.birthday.year

if __name__=="__main__":
    User=User(Date(1990,2,1))
    print(User.get_age())
    print(User.birthday)
    print(User.get_age( ) )
複製代碼

9 python對象的自省機制

#自省是經過必定的機制查詢到對象的內部結構
class Person:
    name="user"

     
class Student(Person):
    def __init__(self,school_name):
        self.school_name=school_name

if __name__=="__main__":
    user=Student("慕課網")

    #經過__dict__查詢屬性
    print(user.__dict__)
    user.__dict__["school_addr"] ="北京市"
    print(user.school_addr)
    print(Person.__dict__)
    print(user.name)

    a=[1,2]
    print(dir(a))
複製代碼

10 super真的是調用父類嗎?

class A:
    def __init__(self):
        print("A")
class B(A):
    def __init__(self):
        print("B")
        super().__init__()

from threading import Thread
class MyThread(Thread):
    def __init__(self,name,user):
        self.user = user
        self.name = name
#既然重寫了B的構造函數,爲何還要去調用super
#super到底執行順序是什麼樣的?

if __name__=="__main__":
        b=B()

class A:
    def __init__(self):
            print("A")
class B(A):
    def __init__(self):
            print("B")
            super().__init__()
class C(A):
    def __init__(self):
        print ("C")
        super().__init__()
class D(B,C):
    def __init__(self):
        print ("D")
        super(D,self).__init__()

if __name__=="__main__":
    print(D.__mro__):
    d=D()
複製代碼

11 mixin繼承案例-django rest framework

#mixin模式特色ui

1.Mixin類功能單一spa

2.不和基類關聯,能夠和任意基類組合,基類能夠不和Mixin關聯就能初始化成功

3.在Mixin中不要使用super這種用法

class GoodsListViewSet(CacheResponseMixin,Mixins.ListModelMixin,mixins.RetrieveModelMixin
複製代碼

12 python中的with語句

#try,except,finally
try:
    print ("code started")
    raise KeyError
except KeyError as e:
    print ("Key error")
except IndexError as e:
else:
    print("other error")
finally:
    f_read.close()
複製代碼
#try,except,finally
def exe_try():
        try:
            print ("code started")
            raise KeyError
            return 1
        except KeyError as e:
            print ("key error")
            return 2
        else:
            print("other error")
            return 3
        finally:
            print("finally")
            return 4
        if __name__=="__main__":
            result=exe_try
            print(result)
複製代碼
#上下文管理器協議
class Sample():
    def __enter__(self):
        #獲取資源
        print("enter")
        return self 
    def __exit__(self,exc_type,exc_val,exc_tb):
        #(釋放資源)
        print("exit")
    def do_something(self):
        print ("do something")
        
with Sample() as sample:
    sample.do_something()
複製代碼

13 contextlib簡化上下文管理器

import contextlib
@contextlib.contextmanager
def file_open(file_name):
    print("file open")
    yield {}
    print ("file end")
    
with file_open("today.txt") as f_opened:
    print ("file processing")

複製代碼

14 本章小結

python中一切皆對象,鴨子類型和多態,鴨子類型實際上沒有接口,遵循了python中的一些協議將魔法函數進行組合,抽象基類,mixin,類變量和對象變量,對象自省,super查找順序,with語句,contextlib上下文管理器.

相關文章
相關標籤/搜索