『壹』 python下的抽象類的用途和意義
抽象方法是基類中定義的方法,但卻沒有任何實現。在java中,可以把方法申明成一個介面。而在python中實現一個抽象方法的簡單的方法是:x0dx0aclass Sheep(object):x0dx0adef get_size(self):x0dx0araise NotImplementedErrorx0dx0a任何從Sheep繼承下來的子類必須實現get_size方法。否則就會產生一個錯誤。但這種實現方法有個缺點。定義的子類只有調用那個方法時才會拋錯。這里有個簡單方法可以在類被實例化後觸發它。使用python提供的abc模塊。x0dx0aimport abcx0dx0aclass Sheep(object):x0dx0a__metaclass__ = [email protected] get_size(self):x0dx0areturnx0dx0a這里實例化Sheep類或任意從其繼承的子類(未實現get_size)時候都會拋出異常。x0dx0a因此,通過定義抽象類,可以定義子類的共同method(強制其實現)。
『貳』 Python語言到底有哪些優點呢
多年來,Python在各種流行編程語言中一直排名靠前,它自身的特點讓Python成為世界上功能最豐富的編程語言之一,可以適用於任何項目開發,因此Python深受開發工程師的喜愛。那到底Python自身有哪些優點使得Python深得大家的喜歡,下面和四川優就業的小編一起來看看吧。
一、簡單易學
Python語言的優點第一個就是簡單易學,Python最大的優點之一是具有偽代碼的本質,它使我們在開發Python程序時,專注的是解決問題,而不是搞明白語言本身。Python採用C語言進行開發,但是Python不再有C語言中的指針等復雜的數據類型存在。舉個例子來說,同樣一個程序,使用C可能需要1000行代碼,使用Java需要100行代碼,而使用Python則只需要20行代碼。這也就是很多新手小白選擇學習Python的原因,它沒有那麼復雜的邏輯,代碼簡潔規范,關鍵字也相對較少,說明文檔還非常簡單,極易上手。
二、免費開源
簡單地說,我們不用花一分錢,就可以直接下載安裝使用,自由的發布軟體的拷貝、閱讀它的源代碼,還可以對其源碼進行修改,並能把它的一部分用於新的自由軟體中。
三、開發速度快、效率高
Python被稱為「膠水語言」,並且有豐富強大庫,可以實現很多強大的功能,因此Python運行速度非常快,開發效率非常高。
四、面向對象
Python具有很強的面向對象特性,同時也簡單化了面向對象的實現,可以消除保護類型、抽象類、介面等面向對象的元素。與其他主要的語言如C++和Java相比,Python以一種非常強大又簡單的方式實現面向對象編程。
除了以上的這些優點,Python還有很多像可移植性強、可擴展性、可嵌入性等優勢。也正是這些優點,所以造就了功能強大的Python語言。
『叄』 python的特性是什麼
Python是一門大家都比較熟悉的一門計算機語言,也是比較簡單的一門計算機語言,相對於來說更加簡單一些,而且也是不少人進入行業內的首要選擇。
Python是一門好用又簡單易學的計算機編程語言,在近幾年中,Python受到了不少IT人士的追捧,熱度也是越來越高了,成為了我們入門首選的編程語言,為什麼呢?因為Python具有非常廣泛的應用范圍,在人工智慧、web開發之中具有非常好的應用,同時在金融分析、爬蟲等領域也具有很大的作用。
1、Python採用C語言進行開發,但是Python不再有C語言中的指針等復雜的數據類型存在。
2、Python具有很強的面向對象特性,同時也簡單化了面向對象的實現,可以消除保護類型、抽象類、介面等面向對象的元素。
3、Python代碼可以使用空格或者製表符縮進的方式分割代碼。
4、Python僅僅只有31個保留字,而且沒有分號、begin、end等標記。
5、Python是強類型的語言,變數創建之後會對應一種數據類型,出現在統一表達式中的不同類型的變數需要做類型轉換。
『肆』 如何在Python中使用static,class,abstract方法
方法在Python中是如何工作的
方法就是一個函數,它作為一個類屬性而存在,你可以用如下方式來聲明、訪問一個函數:
Python
1
2
3
4
5
6
7
8
>>> class Pizza(object):
... def __init__(self, size):
... self.size = size
... def get_size(self):
... return self.size
...
>>> Pizza.get_size
<unbound method Pizza.get_size>
Python在告訴你,屬性_get_size是類Pizza的一個未綁定方法。這是什麼意思呢?很快我們就會知道答案:
Python
1
2
3
4
>>> Pizza.get_size()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: unbound method get_size() must be called with Pizza instance as first argument (got nothing instead)
我們不能這么調用,因為它還沒有綁定到Pizza類的任何實例上,它需要一個實例作為第一個參數傳遞進去(Python2必須是該類的實例,Python3中可以是任何東西),嘗試一下:
Python
1
2
>>> Pizza.get_size(Pizza(42))
42
太棒了,現在用一個實例作為它的的第一個參數來調用,整個世界都清靜了,如果我說這種調用方式還不是最方便的,你也會這么認為的;沒錯,現在每次調用這個方法的時候我們都不得不引用這個類,如果不知道哪個類是我們的對象,長期看來這種方式是行不通的。
那麼Python為我們做了什麼呢,它綁定了所有來自類_Pizza的方法以及該類的任何一個實例的方法。也就意味著現在屬性get_size是Pizza的一個實例對象的綁定方法,這個方法的第一個參數就是該實例本身。
Python
1
2
3
4
>>> Pizza(42).get_size
<bound method Pizza.get_size of <__main__.Pizza object at 0x7f3138827910>>
>>> Pizza(42).get_size()
42
和我們預期的一樣,現在不再需要提供任何參數給_get_size,因為它已經是綁定的,它的self參數會自動地設置給Pizza實例,下面代碼是最好的證明:
Python
1
2
3
>>> m = Pizza(42).get_size
>>> m()
42
更有甚者,你都沒必要使用持有Pizza對象的引用了,因為該方法已經綁定到了這個對象,所以這個方法對它自己來說是已經足夠了。
也許,如果你想知道這個綁定的方法是綁定在哪個對象上,下面這種手段就能得知:
Python
1
2
3
4
5
6
7
>>> m = Pizza(42).get_size
>>> m.__self__
<__main__.Pizza object at 0x7f3138827910>
>>> # You could guess, look at this:
...
>>> m == m.__self__.get_size
True
顯然,該對象仍然有一個引用存在,只要你願意你還是可以把它找回來。
在Python3中,依附在類上的函數不再當作是未綁定的方法,而是把它當作一個簡單地函數,如果有必要它會綁定到一個對象身上去,原則依然和Python2保持一致,但是模塊更簡潔:
Python
1
2
3
4
5
6
7
8
>>> class Pizza(object):
... def __init__(self, size):
... self.size = size
... def get_size(self):
... return self.size
...
>>> Pizza.get_size
<function Pizza.get_size at 0x7f307f984dd0>
靜態方法
靜態方法是一類特殊的方法,有時你可能需要寫一個屬於這個類的方法,但是這些代碼完全不會使用到實例對象本身,例如:
Python
1
2
3
4
5
6
7
class Pizza(object):
@staticmethod
def mix_ingredients(x, y):
return x + y
def cook(self):
return self.mix_ingredients(self.cheese, self.vegetables)
這個例子中,如果把_mix_ingredients作為非靜態方法同樣可以運行,但是它要提供self參數,而這個參數在方法中根本不會被使用到。這里的@staticmethod裝飾器可以給我們帶來一些好處:
Python不再需要為Pizza對象實例初始化一個綁定方法,綁定方法同樣是對象,但是創建他們需要成本,而靜態方法就可以避免這些。
Python
1
2
3
4
5
6
>>> Pizza().cook is Pizza().cook
False
>>> Pizza().mix_ingredients is Pizza.mix_ingredients
True
>>> Pizza().mix_ingredients is Pizza().mix_ingredients
True
可讀性更好的代碼,看到@staticmethod我們就知道這個方法並不需要依賴對象本身的狀態。
可以在子類中被覆蓋,如果是把mix_ingredients作為模塊的頂層函數,那麼繼承自Pizza的子類就沒法改變pizza的mix_ingredients了如果不覆蓋cook的話。
類方法
話雖如此,什麼是類方法呢?類方法不是綁定到對象上,而是綁定在類上的方法。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> class Pizza(object):
... radius = 42
... @classmethod
... def get_radius(cls):
... return cls.radius
...
>>>
>>> Pizza.get_radius
<bound method type.get_radius of <class '__main__.Pizza'>>
>>> Pizza().get_radius
<bound method type.get_radius of <class '__main__.Pizza'>>
>>> Pizza.get_radius is Pizza().get_radius
True
>>> Pizza.get_radius()
42
無論你用哪種方式訪問這個方法,它總是綁定到了這個類身上,它的第一個參數是這個類本身(記住:類也是對象)。
什麼時候使用這種方法呢?類方法通常在以下兩種場景是非常有用的:
工廠方法:它用於創建類的實例,例如一些預處理。如果使用@staticmethod代替,那我們不得不硬編碼Pizza類名在函數中,這使得任何繼承Pizza的類都不能使用我們這個工廠方法給它自己用。
Python
1
2
3
4
5
6
7
class Pizza(object):
def __init__(self, ingredients):
self.ingredients = ingredients
@classmethod
def from_fridge(cls, fridge):
return cls(fridge.get_cheese() + fridge.get_vegetables())
調用靜態類:如果你把一個靜態方法拆分成多個靜態方法,除非你使用類方法,否則你還是得硬編碼類名。使用這種方式聲明方法,Pizza類名明永遠都不會在被直接引用,繼承和方法覆蓋都可以完美的工作。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Pizza(object):
def __init__(self, radius, height):
self.radius = radius
self.height = height
@staticmethod
def compute_area(radius):
return math.pi * (radius ** 2)
@classmethod
def compute_volume(cls, height, radius):
return height * cls.compute_area(radius)
def get_volume(self):
return self.compute_volume(self.height, self.radius)
抽象方法
抽象方法是定義在基類中的一種方法,它沒有提供任何實現,類似於Java中介面(Interface)裡面的方法。
在Python中實現抽象方法最簡單地方式是:
Python
1
2
3
class Pizza(object):
def get_radius(self):
raise NotImplementedError
任何繼承自_Pizza的類必須覆蓋實現方法get_radius,否則會拋出異常。
這種抽象方法的實現有它的弊端,如果你寫一個類繼承Pizza,但是忘記實現get_radius,異常只有在你真正使用的時候才會拋出來。
Python
1
2
3
4
5
6
7
>>> Pizza()
<__main__.Pizza object at 0x7fb747353d90>
>>> Pizza().get_radius()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
File "<stdin>", line 3, in get_radius
NotImplementedError
還有一種方式可以讓錯誤更早的觸發,使用Python提供的abc模塊,對象被初始化之後就可以拋出異常:
Python
1
2
3
4
5
6
7
8
import abc
class BasePizza(object):
__metaclass__= abc.ABCMeta
@abc.abstractmethod
def get_radius(self):
"""Method that should do something."""
使用abc後,當你嘗試初始化BasePizza或者任何子類的時候立馬就會得到一個TypeError,而無需等到真正調用get_radius的時候才發現異常。
Python
1
2
3
4
>>> BasePizza()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: Can't instantiate abstract class BasePizza with abstract methods get_radius
混合靜態方法、類方法、抽象方法
當你開始構建類和繼承結構時,混合使用這些裝飾器的時候到了,所以這里列出了一些技巧。
記住,聲明一個抽象的方法,不會固定方法的原型,這就意味著雖然你必須實現它,但是我可以用任何參數列表來實現:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import abc
class BasePizza(object):
__metaclass__= abc.ABCMeta
@abc.abstractmethod
def get_ingredients(self):
"""Returns the ingredient list."""
class Calzone(BasePizza):
def get_ingredients(self, with_egg=False):
egg = Egg() if with_egg else None
return self.ingredients + egg
這樣是允許的,因為Calzone滿足BasePizza對象所定義的介面需求。同樣我們也可以用一個類方法或靜態方法來實現:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import abc
class BasePizza(object):
__metaclass__= abc.ABCMeta
@abc.abstractmethod
def get_ingredients(self):
"""Returns the ingredient list."""
class DietPizza(BasePizza):
@staticmethod
def get_ingredients():
return None
這同樣是正確的,因為它遵循抽象類BasePizza設定的契約。事實上get_ingredients方法並不需要知道返回結果是什麼,結果是實現細節,不是契約條件。
因此,你不能強制抽象方法的實現是一個常規方法、或者是類方法還是靜態方法,也沒什麼可爭論的。從Python3開始(在Python2中不能如你期待的運行,見issue5867),在abstractmethod方法上面使用@staticmethod和@classmethod裝飾器成為可能。
Python
1
2
3
4
5
6
7
8
9
10
11
12
import abc
class BasePizza(object):
__metaclass__= abc.ABCMeta
ingredient = ['cheese']
@classmethod
@abc.abstractmethod
def get_ingredients(cls):
"""Returns the ingredient list."""
return cls.ingredients
別誤會了,如果你認為它會強制子類作為一個類方法來實現get_ingredients那你就錯了,它僅僅表示你實現的get_ingredients在BasePizza中是一個類方法。
可以在抽象方法中做代碼的實現?沒錯,Python與Java介面中的方法相反,你可以在抽象方法編寫實現代碼通過super()來調用它。(譯註:在Java8中,介面也提供的默認方法,允許在介面中寫方法的實現)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import abc
class BasePizza(object):
__metaclass__= abc.ABCMeta
default_ingredients = ['cheese']
@classmethod
@abc.abstractmethod
def get_ingredients(cls):
"""Returns the ingredient list."""
return cls.default_ingredients
class DietPizza(BasePizza):
def get_ingredients(self):
return ['egg'] + super(DietPizza, self).get_ingredients()
這個例子中,你構建的每個pizza都通過繼承BasePizza的方式,你不得不覆蓋get_ingredients方法,但是能夠使用默認機制通過super()來獲取ingredient列表。
打賞支持我翻譯更多好文章,謝謝!
『伍』 python中的concurrent.futures模塊
concurrent.futures 模塊提供了並發執行調用的高級介面
並發可以使用 threads 執行,使用 ThreadPoolExecutor 或 分離的 processes ,使用 ProcessPoolExecutor 。都實現了同一個介面,這個介面在抽象類 Executor 定義
wait 等待 fs 裡面所有的 Future 實例(由不同的 Executors 實例創建的)完成。返回兩個命名元祖,第一個元祖名為 done ,存放完成的 futures 對象,第二個元祖名為 not_done ,存放未完成的 futures 。
return_when 參數必須是 concurrent.futures 裡面定義的常量: FIRST_COMPLETED , FIRST_EXCEPTION , ALL_COMPLETED
返回一個迭代器, yield 那些完成的 futures 對象。 fs 裡面有重復的也只可能返回一次。任何 futures 在調用 as_completed() 調用之前完成首先被 yield 。
Future() 封裝了可調用對象的非同步執行。 Future 實例可以被 Executor.submit() 方法創建。除了測試之外不應該直接創建。 Future 對象可以和非同步執行的任務進行交互
1、抽象類,提供非同步調用的方法。不能被直接使用,而是通過構建子類。
2、方法
shutdown(wait=True)
給 executor 發信號,使其釋放資源,當 futures 完成執行時。已經 shutdown 再調用 submit() 或 map() 會拋出 RuntimeError 。使用 with 語句,就可以避免必須調用本函數
ThreadPoolExecutor 是 Executor 的子類使用線程池來非同步執行調用
如果使用不正確可能會造成死鎖,所以 submit 的 task 盡量不要調用 executor 和 futures ,否則很容易出現死鎖
默認的max_workers是設備的處理器數目*5
ProcessPoolExecutor 使用 multiprocessing 模塊,不受 GIL 鎖的約束,意味著只有可以 pickle 的對象才可以執行和返回
__main__ 必須能夠被工作子進程導入。所以意味著 ProcessPoolExecutor 在互動式解釋器下不能工作。
提交給 ProcessPoolExecutor 的可調用方法裡面調用 Executor 或 Future 將會形成死鎖。
class concurrent.futures.ProcessPoolExecutor(max_workers=None)
max_workers 默認是處理器的個數
exception concurrent.futures.CancelledError
exception concurrent.futures.TimeoutError
exception concurrent.futures.process.BrokenProcessPool
『陸』 python基礎(abc類)
ABC是Abstract Base Class的縮寫。
Python本身不提供抽象類和介面機制,要想實現抽象類,可以藉助abc模塊。
abc類中常見的方法有:ABCMeta,abstractmethod,classmethod
這是用來生成抽象基礎類的元類。由它生成的類可以被直接繼承。
通過注冊進行具體化抽象類
通過繼承具體化抽象類
『柒』 大數據主要學習什麼呢
大數據主要學習的東西有6個方面:
第一階段
JavaSE基礎核心
第二階段
資料庫關鍵技術
第三階段
大數據基礎核心
第四階段
Spark生態體系框架&大數據高薪精選項目
第五階段
Spark生態體系框架&企業無縫對接項目
第六階段
Flink流式數據處理框架