維基百科:當看到一隻鳥走起來像鴨子,游泳起來像鴨子,叫起來也像鴨子,那麼這隻鳥就能夠被稱爲鴨子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)
複製代碼
抽象基類(abstract base class)相似java中的接口python
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()
複製代碼
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主要是判斷兩個的值是否相等
複製代碼
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__)
複製代碼
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)
####
複製代碼
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( ) )
複製代碼
#自省是經過必定的機制查詢到對象的內部結構
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))
複製代碼
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()
複製代碼
#mixin模式特色ui
1.Mixin類功能單一spa
2.不和基類關聯,能夠和任意基類組合,基類能夠不和Mixin關聯就能初始化成功
3.在Mixin中不要使用super這種用法
class GoodsListViewSet(CacheResponseMixin,Mixins.ListModelMixin,mixins.RetrieveModelMixin
複製代碼
#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()
複製代碼
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")
複製代碼
python中一切皆對象,鴨子類型和多態,鴨子類型實際上沒有接口,遵循了python中的一些協議將魔法函數進行組合,抽象基類,mixin,類變量和對象變量,對象自省,super查找順序,with語句,contextlib上下文管理器.