劉明浩表示,這隻死亡的穿山甲是雌性

劉明浩表示,這隻死亡的穿山甲是雌性,體長超過50公分,個體可能不到兩歲,身上佈滿咬痕,背甲也有見骨的傷口,判斷是死於犬隻的口中。他說,屍體離校內「動保社」的犬舍很近,就連拍照當下都有5隻狗在附近徘徊。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※新北市探針選用參考標準?

※如何知道自已的電腦cpu支不支持AVX指令集?

※如何正確使用飲水機?

※攻戰消費者第一視覺,包裝設計很重要!

※滑鼠墊適用各種文宣活動廣告曝光,專業客製服務

※封口機購物網-不怕你比價,就怕你買貴!

※高溫殺菌機最多可達多少溫度?

中國微信群近日廣傳一條「三峽大壩發生變型並可能潰壩」的消息

中國微信群近日廣傳一條「三峽大壩發生變型並可能潰壩」的消息,發表圖文者將兩張疑似谷歌衛星圖的三峽大壩圖片拼接在一起,其中左圖中看不出大壩有異常,右圖中壩體有明顯扭曲,對比效果明顯。

三峽集團流域樞紐管理局樞紐運行部主任專業師曹毅表示,網傳的谷歌衛星圖並非衛星直接拍攝,而是經過系列算法處理形成,因此某些場景出現偏差,大壩並未變型。

澎湃新聞說,經查詢騰訊地圖的衛星圖,顯示三峽大壩壩體並未出現扭曲或變型。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※無塵擦拭紙各大品牌廠商販售比價網!

※如何正確使用飲水機?

※如何知道自已的電腦cpu支不支持AVX指令集?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

※精密CNC 自動車床設備介紹

※選用哪種桶裝水,外宿露營超方便?

※空壓機這裡買最划算!

為提高住宅型綠能屋頂的設置進度

為提高住宅型綠能屋頂的設置進度,經濟部擬針對地方政府執行面投入誘因,如提高地方政府的回饋金,由業者與台電簽定購售電合約(PPA)後,須將其中3%饋給地方政府,但限定僅能將回饋金用於綠能推廣相關作業。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※客製專屬滑鼠墊、可愛造型L夾、L型資料夾、透明證件套、手提袋,專業印刷設計廠商!  

※示波器鮮為人知的使用技巧?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

※買不起高檔茶葉,精緻包裝茶葉罐,也能撐場面!

※各種升降平台款式?

※高效率洗滌塔活性碳設備有哪些?

※專業模具開發-五金製品代工製作廠

HTML5 知識一覽,10分鐘搞定它

HTML5知識點匯總

HTML5 中的一些有趣的新特性

用於繪畫的 canvas 元素
用於媒介回放的 video 和 audio 元素
對本地離線存儲的更好的支持
新的特殊內容元素,比如 article、footer、header、nav、section
新的表單控件,比如 calendar(日曆)、date(日期)、time(時間格式)、email(郵件)、url(鏈接)、search(搜尋),可以方便用戶填寫或者方便格式驗證。

目錄:

  • 新增內容元素解釋及表單控件舉例
  • 視頻
  • 音頻
  • 拖放
  • 畫布
  • SVG
  • 地理定位
  • Web存儲
  • 應用緩存
  • Web Workers
  • 服務器發送事件

PS以下內容只是基於個人對HTML5的大致理解,做個筆記,若有錯誤,請不要吝嗇指出哈,詳情可以查看 https://www.w3school.com.cn/html5/index.asp

表單控件舉例

1、date

<input type="date" >

效果圖:

HTML5視頻

直到現在,仍然不存在一項旨在網頁上显示視頻的標準。
今天,大多數視頻是通過插件(比如Flash)來显示的。然而,並非所有瀏覽器都擁有同樣的插件。
HTML5 規定了一種通過 video 元素來包含視頻的標準方法。
#最簡單的用法

  <video src="movie.ogg" controls="controls">不支持H5時显示的內容</video>   //controls="controls"是自帶簡單的控制組件
#兼容瀏覽器,運用<source>標籤,嵌入多個視頻格式鏈接,瀏覽器只識別第一個可識別的格式

<video width="320" height="240" controls="controls">
<source src="movie.ogg" type="video/ogg">
<source src="movie.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>

HTML5音頻

直到現在,仍然不存在一項旨在網頁上播放音頻的標準。
今天,大多數音頻是通過插件(比如Flash)來播放的。然而,並非所有瀏覽器都擁有同樣的插件。
HTML5 規定了一種通過 audio 元素來包含音頻的標準方法。
audio 元素能夠播放聲音文件或者音頻流。

<audio src="song.ogg" controls="controls">網頁不支持H5時显示的內容</audio>
#兼容瀏覽器,瀏覽器只識別第一個可播放的音頻文件格式

<audio controls="controls">
<source src="song.ogg" type="audio/ogg">
<source src="song.mp3" type="audio/mpeg">
Your browser does not support the audio tag.
</audio>

先明確一個點:網頁中默認元素是不可拖動的,也是不可把其他元素放在另一個元素上面的,以下ev為DOM傳遞的參數event,以下為拖動步驟:
1、拖放的元素
(1)設置元素可拉動—— draggable=”true”,如

<img draggable="true" />

(2)元素被拖動時保存數據——ondragstart=”ev.dataTransfer.setData(“變量名”,ev.target.id)”
2、放的地方
(1)其他元素懸空至本元素時,設置本元素可放置其他元素,這樣才可以將其放進去——ev.preventDefault();

##設置要被放置元素的標籤的事件ondragover="allowDrop(event)"

function allowDrop(ev)
{
ev.preventDefault();
}

(2)放下被拖動的元素時,再次設置本元素可放置其他元素,並獲取元素,將元素添加為本元素的子元素(本質)

<!- 相對應的放置其他元素的容器設置,ondrop為放下時,ondragover是有其他元素懸空至本元素時->
<div id="div1" ondrop="drop(event)"
ondragover="allowDrop(event)"></div>

function drop(ev)
{
ev.preventDefault();
var data=ev.dataTransfer.getData("Text");
ev.target.appendChild(document.getElementById(data));
}

畫布

介紹:畫布就是利用javascript在網頁上繪製圖像的一種元素,畫布是一塊舉行區域,我們可以控制它的每一個像素
使用(三步走):
1、創建Canvas元素:eg:

<canvas id="myCanvas" width="200" height="100"></canvas>

2、獲取canvas元素,創建context對象:eg:

var c=document.getElementById("myCanvas");

3、繪製,eg:

cxt.fillStyle="#FF0000";
cxt.fillRect(0,0,150,75);

SVG

定義

  • SVG 指可伸縮矢量圖形 (Scalable Vector Graphics)
  • SVG 用於定義用於網絡的基於矢量的圖形
  • SVG 使用 XML 格式定義圖形
  • SVG 圖像在放大或改變尺寸的情況下其圖形質量不會有損失
  • SVG 是萬維網聯盟的標準
    總結:內容為純粹的XML格式,可無線放大拉伸像素不變,尺寸比jpeg、gif等小,圖像中有文本還可以被搜索到(適合做地圖等)。
    競爭對手:Flash,SVG優勢:與其他標準(比如 XSL 和 DOM)相兼容,而 Flash 則是未開源的私有技術

使用方法:

(1)使用標籤引入

  • 優勢:所有主要瀏覽器都支持,並允許使用腳本

  • 缺點:不推薦在HTML4和XHTML中使用(但在HTML5允許)

    <embed src="circle1.svg" type="image/svg+xml" /> 
    

(2)使用標籤引入

  • 優勢:所有主要瀏覽器都支持,並支持HTML4,XHTML和HTML5標準

  • 缺點:不允許使用腳本。

    <object data="circle1.svg" type="image/svg+xml"></object> 
    

(3)使用 iframe 標籤引入

  • 優勢:所有主要瀏覽器都支持,並允許使用腳本

  • 缺點:不推薦在HTML4和XHTML中使用(但在HTML5允許)

    //<iframe src="circle1.svg"></iframe> 
    

(4)直接在HTML嵌入SVG代碼
在Firefox、Internet Explorer9、谷歌Chrome和Safari中,你可以直接在HTML嵌入SVG代碼。

  <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
     <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
  </svg>   

(5)直接使用鏈接嵌入

  <a href="circle1.svg">View SVG file</a> 

地理定位

HTML5 Geolocation API 用於獲得用戶的地理位置。

用法:

主要使用navigator.geolocation對象來獲取地理位置信息,它主要有getCurrentPosition(),watchPosition(),clearWatch()三個方法
(1)getCurrentPosition

(2)watchPosition
返回用戶的當前位置,並繼續返回用戶移動時的更新位置(就像汽車上的 GPS)。
(3)clearWatch(),停止 watchPosition() 方法

例子:

  //例子關鍵代碼:返回用戶位置的經度和緯度
   function getLocation(){
        if (navigator.geolocation){
            navigator.geolocation.getCurrentPosition(showPosition);
      }}

效果:

Web 存儲

瀏覽器中的數據本來是由 cookie 完成的。但是 cookie不適合大量數據的存儲,因為它們由每個對服務器的請求來傳遞,這使得 cookie 速度很慢而且效率也不高。
在 HTML5 中,數據不是由每個服務器請求傳遞的,而是只有在請求時使用數據。它使在不影響網站性能的情況下存儲大量數據成為可能。
對於不同的網站,數據存儲於不同的區域,並且一個網站只能訪問其自身的數據
HTML5 使用 JavaScript 來存儲和訪問數據。

介紹

1、localStorage 方法存儲的數據沒有時間限制。第二天、第二周或下一年之後,數據依然可用。
2、sessionStorage方法用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問並且當會話結束后數據也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲,僅、是會話級別的存儲。只允許同一窗口訪問。 (同一個頁面才可以訪問存儲的元素,刷新也可以繼續訪問,但是關閉頁面重新打開,數據就不見了)

使用

1、先判斷(瀏覽器是否支持)——if(typeof(Storage)!==”undefine”){若支持執行的代碼段}else{不支持執行代碼段}
2、localStorage的增刪改查
增:localStorage.setItem(“propName”,”value”)
刪:localStorage.removeItem(‘propName’)
改:localStotage.propNmae=newValue
查:localStorage.getItem(propName)
3、sessionStorage的增刪改查
增:sessionStorage.setItem(“propName”,”value”)
刪:sessionStorage.removeItem(‘propName’)
改:sessionStotage.propNmae=newValue
查:sessionStorage.getItem(propName)

例子(localstorage,session同下):

<body>
<div id="result"></div>
<script>
// Check browser support
if (typeof(Storage) !== "undefined") {
// Store
    localStorage.setItem("lastname", "Gates");
// Retrieve
    document.getElementById("result").innerHTML = localStorage.getItem("lastname");
} else {
    document.getElementById("result").innerHTML = "抱歉!您的瀏覽器不支持 Web Storage ...";
}
</script>
</body>

sessionStorage 、localStorage和cookei的區別:

應用場景

因為考慮到每個 HTTP 請求都會帶着 Cookie 的信息,所以 Cookie 當然是能精簡就精簡啦,比較常用的一個應用場景就是判斷用戶是否登錄。針對登錄過的用戶,服務器端會在他登錄時往 Cookie 中插入一段加密過的唯一辨識單一用戶的辨識碼,下次只要讀取這個值就可以判斷當前用戶是否登錄啦。曾經還使用 Cookie 來保存用戶在電商網站的購物車信息,如今有了 localStorage,似乎在這個方面也可以給 Cookie 放個假了~
而另一方面 localStorage 接替了 Cookie 管理購物車的工作,同時也能勝任其他一些工作。比如HTML5遊戲通常會產生一些本地數據,localStorage 也是非常適用的。如果遇到一些內容特別多的表單,為了優化用戶體驗,我們可能要把表單頁面拆分成多個子頁面,然後按步驟引導用戶填寫。這時候 sessionStorage 的作用就發揮出來了。

應用緩存——Application Cache

HTML5 引入了應用程序緩存,這意味着 web 應用可進行緩存,並可在沒有因特網連接時進行訪問。
應用程序緩存為應用帶來三個優勢:
離線瀏覽 – 用戶可在應用離線時使用它們
速度 – 已緩存資源加載得更快
減少服務器負載 – 瀏覽器將只從服務器下載更新過或更改過的資源。

使用:

1、manifest文件配置:
manifest 文件可分為三個部分:

CACHE MANIFEST(必須)- 在此標題下列出的文件將在首次下載後進行緩存
NETWORK – 在此標題下列出的文件需要與服務器的連接,且不會被緩存
FALLBACK – 在此標題下列出的文件規定當頁面無法訪問時的回退頁面(比如 404 頁面)

例子:
CACHE MANIFEST

# 2012-02-21 v1.0.0    //註釋行,在服務器中更改一個函數或者一幅圖片,此文件都不會被修改,但更新此備註卻可以更新緩存文件的方法
/theme.css
/logo.gif
/main.js
NETWORK:
login.asp
FALLBACK:
/html5/ /404.html
PS:瀏覽器對緩存數據的容量限制可能不太一樣(某些瀏覽器設置的限制是每個站點 5MB)
##以下為html文件中的使用直接在html標籤中將其引入
<html manifest="demo.appcache">  //直接在html文件中引入appcache文件

web Workers

介紹:運行在後台的一個js腳本,獨立於其他腳本,不影響頁面性能

使用:

0、創建一個需要用於後台運行的js文本文件——需要一個postMessage(data) //向某個頁面傳達信息
1、先判斷瀏覽器是否支持:if(typeof(Worker)!==”undefined”)
2、創建new Worker(‘js文本路徑’)
3、使用onmessage監聽是否有消息傳來,所有則接收js傳來的信息,並加以處理運用
4、終止Web Worker 終止 web worker,並釋放瀏覽器/計算機資源,請使用 terminate() 方法 //終止后需刷新頁面才可重新使用

例子:

創建計數腳本,該腳本存儲於 “demo_workers.js” 文件中:

var i=0;
function timedCount()
{
i=i+1;
postMessage(i);
setTimeout("timedCount()",500);
}
timedCount();

以下是html文件:

<!DOCTYPE html>
<html>
<body>

<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<br /><br />

<script>
var w;

function startWorker()
{
if(typeof(Worker)!=="undefined")
{
  if(typeof(w)=="undefined")
    {
    w=new Worker("demo_workers.js");
    }
  w.onmessage = function (event) {
    document.getElementById("result").innerHTML=event.data;
  };
}
else
{
document.getElementById("result").innerHTML="Sorry, your browser
 does not support Web Workers...";
}
}

function stopWorker()
{
w.terminate();
}
</script>

</body>
</html>

效果圖:

補充:

onOpen :當通往服務器的連接被打開
onMessage:當接收到消息
onerror :當錯誤發生

注意:

1、web worker 通常不用於如此簡單的腳本,而是用於更耗費 CPU 資源的任務。
2、由於 web worker 位於外部文件中,它們無法訪問下例 JavaScript 對象:
window 對象
document 對象
parent 對象

服務器發送事件:

介紹:Server-Sent 事件 – 單向消息傳遞

Server-Sent 事件指的是網頁自動獲取來自服務器的更新。
以前也可能做到這一點,前提是網頁不得不詢問是否有可用的更新。通過服務器發送事件,更新能夠自動到達。
例子:Facebook/Twitter 更新、估價更新、新的博文、賽事結果等。

使用: 判、創、監聽、使用。

html文件:

if(typeof(EventSource)!=="undefined"){           //判
var source=new EventSource("demo_sse.php");       //創
source.onmessage=function(event)                  //監聽
  {
  document.getElementById("result").innerHTML+=event.data + "<br />";  //使用
  };
  else
    {
         document.getElementById("result").innerHTML="抱歉,您的瀏覽器不支持 server-sent 事件 ...";
     }

demo_sse.php文件

<?php
header('Content-Type: text/event-stream');   //把報頭 "Content-Type" 設置為 "text/event-stream"
header('Cache-Control: no-cache');           //規定不對頁面進行緩存
$time = date('r');                         
echo "data: The server time is: {$time}\n\n";  //輸出發送日期(始終以 "data: " 開頭) 
flush();                                       ////向網頁刷新輸出數據
?>

posted on
2020-06-20 11:34  哎呀呀大池  閱讀(
…)  評論(
…)  編輯  收藏
刷新評論 刷新頁面 返回頂部

Powered by: 博客園 Copyright © 2020 哎呀呀大池


Powered by .NET Core on Kubernetes

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※FB行銷專家,教你從零開始的技巧

Python的多繼承問題-MRO和C3算法

Python 中的方法解析順序(Method Resolution Order, MRO)定義了多繼承存在時 Python 解釋器查找函數解析的正確方式。當 Python 版本從 2.2 發展到 2.3 再到現在的 Python 3,MRO算法也隨之發生了相應的變化。這種變化在很多時候影響了我們使用不同版本 Python 編程的過程。

大部分內容轉載自C3 線性化算法與 MRO 理解Python中的多繼承

什麼是 MRO

MRO 全稱方法解析順序(Method Resolution Order)。它定義了 Python 中多繼承存在的情況下,解釋器查找函數解析的具體順序。什麼是函數解析順序?我們首先用一個簡單的例子來說明。請仔細看下面代碼:

class A():
    def who_am_i(self):
        print("I am A")
        
class B(A):
    pass
        
class C(A):
    def who_am_i(self):
        print("I am C")

class D(B,C):
    pass
    
d = D()

如果我問在 Python 2 中使用 D 的實例調用 d.who_am_i(),究竟執行的是 A 中的 who_am_i() 還是 C 中的 who_am_i(),我想百分之九十以上的人都會不假思索地回答:肯定是 C 中的 who_am_i(),因為 C 是 D 的直接父類。然而,如果你把代碼用 Python 2 運行一下就可以看到 d.who_am_i() 打印的是 I am A。

是不是覺得很混亂很奇怪?感到奇怪就對了!!!

這個例子充分展示了 MRO 的作用:決定基類中的函數到底應該以什麼樣的順序調用父類中的函數。可以明確地說,Python 發展到現在,MRO 算法已經不是一個憑藉著執行結果就能猜出來的算法了。如果沒有深入到 MRO 算法的細節,稍微複雜一點的繼承關係和方法調用都能徹底繞暈你。

New-style Class vs. Old-style Class

在介紹不同版本的 MRO 算法之前,我們有必要簡單地回顧一下 Python 中類定義方式的發展歷史。儘管在 Python 3 中已經廢除了老式的類定義方式和 MRO 算法,但對於仍然廣泛使用的 Python 2 來說,不同的類定義方式與 MRO 算法之間具有緊密的聯繫。了解這一點將幫助我們從 Python 2 向 Python 3 遷移時不會出現莫名其妙的錯誤。

在 Python 2.1 及以前,我們定義一個類的時候往往是這個樣子(我們把這種類稱為 old-style class):

class A:
    def __init__(self):
        pass

Python 2.2 引入了新的模型對象(new-style class),其建議新的類型通過如下方式定義:

class A(object):
    def __init__(self):
        pass

注意后一種定義方式显示註明類 A 繼承自 object。Python 2.3 及後續版本為了保持向下兼容,同時提供以上兩種類定義用以區分 old-style class 和 new-style class。Python 3 則完全廢棄了 old-style class 的概念,不論你通過以上哪種方式書寫代碼,Python 3 都將明確認為類 A 繼承自 object。這裏我們只是引入 old-style 和 new-style 的概念,如果你對他們的區別感興趣,可以自行看 stackoverflow 上有關該問題的解釋。

理解 old-style class 的 MRO

我們使用前文中的類繼承關係來介紹 Python 2 中針對 old-style class 的 MRO 算法。如果你在前面執行過那段代碼,你可以看到調用 d.who_am_i() 打印的應該是 I am A。為什麼 Python 2 的解釋器在確定 D 中的函數調用時要先搜索 A 而不是先搜索 D 的直接父類 C 呢?

這是由於 Python 2 對於 old-style class 使用了非常簡單的基於深度優先遍歷的 MRO 算法(關於深度優先遍歷,我想大家肯定都不陌生)。當一個類繼承自多個類時,Python 2 按照從左到右的順序深度遍歷類的繼承圖,從而確定類中函數的調用順序。這個過程具體如下:

  1. 檢查當前的類裏面是否有該函數,如果有則直接調用。
  2. 檢查當前類的第一個父類裏面是否有該函數,如果沒有則檢查父類的第一個父類是否有該函數,以此遞歸深度遍歷。
  3. 如果沒有則回溯一層,檢查下一個父類裏面是否有該函數並按照 2 中的方式遞歸。

上面的過程與標準的深度優先遍歷只有一點細微的差別:步驟 2 總是按照繼承列表中類的先後順序來選擇分支的遍歷順序。具體來說,類 D 的繼承列表中類順序為 B, C,因此,類 D 按照先遍歷 B 分支再遍歷 C 分支的順序來確定 MRO。

我們繼續用第一個例子中的函數繼承圖來說明這個過程:

按照上述深度遞歸的方式,函數 d.who_am_i() 調用的搜索順序是 D, B, A, C, A。由於一個類不能兩次出現,因此在搜索路徑中去除掉重複出現的 A,得到最終的方法解析順序是 D, B, A, C。這樣一來你就明白了為什麼 d.who_am_i() 打印的是 I am A 了。

在 Python 2 中,我們可以通過如下方式來查看 old-style class 的 MRO:

>>> import inspect
>>> inspect.getmro(D)

理解 new-style class 的 MRO

從上面的結果可以看到,使用深度優先遍歷的查找算法並不合理。因此,Python 3 以及 Python 2 針對 new-style class 採用了新的 MRO 算法。如果你使用 Python 3 重新運行一遍上述腳本,你就可以看到函數 d.who_am_i() 的打印結果是 I am C。

>>> d.who_am_i()
I am C
>>> D.__mro__
(<class 'test.D'>, <class 'test.B'>, <class 'test.C'>, <class 'test.A'>, <class 'object'>)

新算法與基於深度遍歷的算法類似,但是不同在於新算法會對深度優先遍歷得到的搜索路徑進行額外的檢查。其從左到右掃描得到的搜索路徑,對於每一個節點解釋器都會判斷該節點是不是好的節點。如果不是好的節點,那麼將其從當前的搜索路徑中移除。

那麼問題在於,什麼是一個好的節點?我們說 N 是一個好的節點當且僅當搜索路徑中 N 之後的節點都不繼承自 N。我們還以上述的類繼承圖為例,按照深度優先遍歷得到類 D 中函數的搜索路徑 D, B, A, C, A。之後 Python 解釋器從左向右檢查時發現第三個節點 A 不是一個好的節點,因為 A 之後的節點 C 繼承自 A。因此其將 A 從搜索路徑中移除,然後得到最後的調用順序 D, B, C, A。

採用上述算法,D 中的函數調用將優先查找其直接父類 B 和 C 中的相應函數。

C3線性化算法

上一小結我們從直觀上概述了針對 new-style class 的 MRO 算法過程。事實上這個算法有一個明確的名字 C3 linearization。下面我們給出其形式化的計算過程。

上面的過程看起來好像很複雜,我們用一個例子來具體執行一下,你就會覺得其實還是挺簡單的。假設我們有如下的一個類繼承關係:

參考來源:Understanding Python MRO – Class search path

class X():
    def who_am_i(self):
        print("I am a X")
        
class Y():
    def who_am_i(self):
        print("I am a Y")
        
class A(X, Y):
    def who_am_i(self):
        print("I am a A")
        
class B(Y, X):
     def who_am_i(self):
         print("I am a B")
         
class F(A, B):
    def who_am_i(self):
        print("I am a F")

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    class F(A, B):
TypeError: Cannot create a consistent method resolution
order (MRO) for bases X, Y

為什麼採用C3算法

上圖中都是使用BFS算法來尋找繼承鏈,但是都會有問題,左邊的繼承模式會違背單調性的原則,右邊的棱形繼承鏈,如果是C重寫了繼承於A的方法,B沒有,但是根據MRO繼承鏈,最終調用的都是A類的方法,C中實現的方法永遠不會被調用,這些都是再python2的問題,python引入C3算法后就解決了這些問題。

C3算法最早被提出是用於Lisp的,應用在Python中是為了解決原來基於深度優先搜索算法不滿足本地優先級,和單調性的問題。
本地優先級:指聲明時父類的順序,比如C(A,B),如果訪問C類對象屬性時,應該根據聲明順序,優先查找A類,然後再查找B類。
單調性:如果在C的解析順序中,A排在B的前面,那麼在C的所有子類里,也必須滿足這個順序。

在Python官網的The Python 2.3 Method Resolution Order中作者舉了例子,說明這一情況

F=type('Food', (), {remember2buy:'spam'})
E=type('Eggs', (F,), {remember2buy:'eggs'})
G=type('GoodFood', (F,E), {})

根據本地優先級在調用G類對象屬性時應該優先查找F類,而在Python2.3之前的算法給出的順序是G E F O,而在心得C3算法中通過阻止類層次不清晰的聲明來解決這一問題,以上聲明在C3算法中就是非法的。

小結

C3算法的核心 :

  1. 遍歷執行merge操作的序列,如果一個序列的第一個元素,在其他序列中也是第一個元素,或不在其他序列出現,則從所有執行merge操作序列中刪除這個元素,合併到當前的mro中。

  2. merge操作后的序列,繼續執行merge操作,直到merge操作的序列為空。

  3. 如果merge操作的序列無法為空,則說明不合法。

參考資料

理解Python中的多繼承-C3 線性化算法

Python的多重繼承問題-MRO和C3算法

Deep Thoughts by Raymond Hettinger

C3 linearization

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※FB行銷專家,教你從零開始的技巧

全國第一個「重要文化景觀」誕生在嘉義

全國第一個「重要文化景觀」誕生在嘉義,就是林業與鐵路相應而生、迄今有107年歷史的「阿里山林業暨鐵道文化景觀」,文化部長鄭麗君今天將到林鐵本線竹崎車站公告,並授證給林務局及嘉義縣、市政府等相關機關。

農委會林務局阿里山林業鐵路及文化資產管理處轄管跨嘉義縣、市且動態保存的阿里山林鐵,去年3月經台北藝術大學建築與文化資產研究所所長黃士娟,以「阿里山林業暨鐵道文化景觀」在我國林業史、鐵路史與相關技術面、產業面的發展深具代表性等理由,爭取政府列為重要文化景觀,文化部依文化資產保存法辦理文資價值評估、現勘及公聽會等審議程序,日前審議通過。

林鐵文資處長黃妙修表示,阿里山林鐵在1912年(日治大正元年)12月,嘉義至二萬平完工通車,全長66.6公里,後因林業開發需求,拓展至阿里山並增設各支線,目前總營業路線長度71.4公里,是世界知名登山鐵路之一,還擁有Z字型、U-turn、螺旋式登山路線與直立汽缸Shay蒸汽機車等四大工法,經地方政府指定古蹟八處、登錄42棟歷史建築,能成為我國首處「重要文化景觀」,令人振奮。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※哪裡買的到省力省空間,方便攜帶的購物推車?

※廢氣洗滌塔,叫得動, 找得到的專業廠商‎

※市面十大品牌封口機!該如何選購?

※塑膠射出成型加工商品有哪些?

※選用哪種桶裝水,外宿露營超方便?

※各款電動堆高機價格?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

由於不滿雅加達的空氣污染十分嚴重,雅加達居民4日委託律師

由於不滿雅加達的空氣污染十分嚴重,雅加達居民4日委託律師,正式通過雅加達中區地方法院,控告包括總統佐科威及數位部長與省長在內的政府高官。

尼爾遜認為,控訴政府高官的目的是為了使他們頒布有關空氣污染問題的措施,應該有這樣的措施。我們必須追尋其源頭的措施,長久以來我們的爭論是否交通、工業,然而,其數據卻沒有。他強調,必須有其數據。

另一方面,環境組織「綠色和平」(Greenpeace)認為,空氣污染和受到破壞,是因為目前在印尼的環境空氣質量標準還很差,致使不能保護民眾免受空氣的污染,我們可從佔碑的森林火災吸取教訓。博丹表指出,首都的空氣污染主要由私人車輛引發的。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※新北市探針選用參考標準?

※如何知道自已的電腦cpu支不支持AVX指令集?

※如何正確使用飲水機?

※攻戰消費者第一視覺,包裝設計很重要!

※滑鼠墊適用各種文宣活動廣告曝光,專業客製服務

※封口機購物網-不怕你比價,就怕你買貴!

※高溫殺菌機最多可達多少溫度?

越南工商部最近審批並頒發2019-2025年階段在越南發展屋頂太陽能發電計劃的《決定》

越南工商部最近審批並頒發2019-2025年階段在越南發展屋頂太陽能發電計劃的《決定》。該計劃的具體目標是到2025年,全國有10萬個屋頂太陽能係統得到安裝和運行,相當於1000百萬瓦。

落實上述目標共有5個主要組成部分,包括:制定政策和規定,按照隨時轉換為市場條件的方向協助發展屋頂太陽能; 展開有關投資、協助技術的試行贊助項目; 各項標準,檢定和試驗; 促進建立市場條件和試行贊助計劃,其中有各項主要活動是研究、分析、考察市場,確定需求,相關各方的角色; 以及太陽能認證計劃旨在展開培訓,向供應設備,提供諮詢勞務,安裝屋頂太陽能係統的各商家簽發屋頂太陽能認證。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※無塵擦拭紙各大品牌廠商販售比價網!

※如何正確使用飲水機?

※如何知道自已的電腦cpu支不支持AVX指令集?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

※精密CNC 自動車床設備介紹

※選用哪種桶裝水,外宿露營超方便?

※空壓機這裡買最划算!

加拿大聯邦政府已宣布新措施來保護聖羅倫斯灣

加拿大聯邦政府已宣布新措施來保護聖羅倫斯灣(Gulf of St. Lawrence)的北大西洋露脊鯨(North Atlantic right whales)。這種海生哺乳動物正受到船隻衝撞、受困捕魚設備等威脅而瀕臨死亡。

新措施包括加強空中偵測來監督聖羅倫斯灣內的露脊鯨,以及擴大現有速限適用範圍等。當區內發現一頭北大西洋露脊鯨時,速限區內的船隻就必須減速到10節(1節= 1海裡/小時)。另外,在速限區週邊5海裡範圍的緩衝區,如果發現鯨魚也必須減速,而先前緩衝區的範圍為2.5海裡。

球大約三分之一的北大西洋露脊鯨每年都會拜訪加拿大海域。而且由於海洋環境出現變化,近幾年來,到訪的露脊鯨數量正持續增加,牠們在聖羅倫斯灣的活動範圍也擴大。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※客製專屬滑鼠墊、可愛造型L夾、L型資料夾、透明證件套、手提袋,專業印刷設計廠商!  

※示波器鮮為人知的使用技巧?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

※買不起高檔茶葉,精緻包裝茶葉罐,也能撐場面!

※各種升降平台款式?

※高效率洗滌塔活性碳設備有哪些?

※專業模具開發-五金製品代工製作廠

烏崁社區理事長黃健忠表示,每逢海膽開放採捕

烏崁社區理事長黃健忠表示,每逢海膽開放採捕,因為欠缺總量控管,海膽幾乎被橫掃一空,對海域海洋生態危害至鉅。社區在3年前製訂公約,向縣府農漁局申請劃設烏崁週邊海域12公頃為保育區,保育區內海域僅開放一支釣,禁止捕撈底棲生物,海洋生態復育看到豐碩的成果。

農漁局表示,對馬公烏崁自主保護海洋資源做法,將全力給予支持,後續在烏崁擴大養殖、放流魚貝類,豐富當地海洋資源量,提高漁民收入,共同為海洋生態復育努力。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※迴轉式空壓機性能介紹 !

※(全省)堆高機租賃保養一覽表

※高效率洗滌塔活性碳設備,能去除多少有機溶劑?

※塑膠射出成型技師工作甘苦談

※專業銷售、服務第一,桶裝水推薦品牌?

※人氣推薦-獨家專業技術熱傳導玻璃煎台

※推薦優質工業用攪拌機製作商