不少人接觸Python,都是從爬蟲開始,其實不少語言均可以作爬蟲,只是Python相對其餘語言來講,更加簡單而已。可是Python並不止於爬蟲,在人工智能,科學計算等方面的應用更加普遍。古人云:萬丈高樓平地起,要想有長足的發展,打好基礎很重要,本文主要講解Python的面向對象相關知識,僅供學習分享使用,若有不足之處,還請指正。編程
以上是面向對象的基本特徵,那麼Python在面向對象方面是如何作的呢?ide
以下所示:函數
1 class Employee: 2 """員工類""" 3 emp_count = 0 # 變量是一個類變量,它的值將在這個類的全部實例之間共享 4 5 def __init__(self, name, salary): 6 """初始化""" 7 self.name = name 8 self.salary = salary 9 Employee.emp_count += 1 10 11 def display_count(self): 12 """顯示數量""" 13 print('Total Employee =', Employee.emp_count) 14 15 def display_employee(self): 16 """顯示信息""" 17 print('name =', self.name, ', salary = ', self.salary) 18 19 def prt(self): 20 """打印本身""" 21 print(self) 22 print(self.__class__) 23 24 def __del__(self): 25 """析構函數""" 26 print(self, '被釋放了')
Python建立對象,不須要new關鍵字,相似於函數的調用,和Java及.Net不一樣。以下所示:學習
1 '建立第一個對象' 2 emp = Employee('Jack', 20) 3 emp.display_count() 4 emp.display_employee() 5 emp.prt()
對象的屬性能夠動態添加,這點與編譯型語言不一樣,以下所示:人工智能
1 emp.age = 17 # 添加一個 'age' 屬性 2 emp.age = 28 # 修改 'age' 屬性 3 del emp.age # 刪除 'age' 屬性
也能夠經過Python的內置方法來添加和獲取屬性,以下所示:spa
1 print(getattr(emp, 'name')) # 獲取屬性 2 print(hasattr(emp, 'age')) # 是否包含屬性 3 setattr(emp, 'age', 18) # 設置屬性和值 4 print(hasattr(emp, 'age')) # 是否包含屬性 5 print(getattr(emp, 'age')) # 獲取屬性 6 delattr(emp, 'age') # 刪除屬性 7 print(hasattr(emp, 'age')) # 是否包含屬性
Python也有內置類的一些屬性,以下所示:code
1 # 內置對象 2 print("Employee.__doc__:", Employee.__doc__) 3 print("Employee.__name__:", Employee.__name__) 4 print("Employee.__module__:", Employee.__module__) 5 print("Employee.__bases__:", Employee.__bases__) 6 print("Employee.__dict__:", Employee.__dict__)
以下所示:對象
1 class JustCounter: 2 """類描述""" 3 __secretCount = 0 # 類的私有變量 4 publicCount = 0 # 公開變量 5 6 def count(self): 7 self.__secretCount += 1 8 self.publicCount += 1 9 print('私有變量:', self.__secretCount)
Python不容許實例化的類訪問私有數據,但你能夠使用 object._className__attrName( 對象名._類名__私有屬性名 )訪問屬性,以下所示:
blog
1 print(counter._JustCounter__secretCount)
面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是經過繼承機制。經過繼承建立的新類稱爲子類或派生類,被繼承的類稱爲基類、父類或超類。繼承
以下所示:Parent表示一個父類,擁有本身的屬性和方法。
1 class Parent: 2 """定義父類""" 3 parentAttr = 100 4 5 def __init__(self): 6 print('調用父類的構造函數') 7 8 def parentMethod(self): 9 print('調用父類方法') 10 11 def setAttr(self, attr): 12 Parent.parentAttr = attr 13 14 def getAttr(self): 15 print('父類屬性:', Parent.parentAttr) 16 17 def myMethod(self): 18 print('我是父類的MyMethod')
Child表示一個子類,繼承自Parent,以下所示:
1 class Child(Parent): 2 """定義子類""" 3 4 def __init__(self): 5 print('調用子類的構造方法') 6 7 def childMethod(self): 8 print('調用子類方法') 9 10 def myMethod(self): 11 """重寫Overrides父類方法""" 12 print('我是子類的MyMethod') 13 14 def __str__(self): 15 """重寫方法,適合人閱讀""" 16 return 'str方法返回'
以下所示:
1 c = Child() # 實例化子類對象 2 c.childMethod() # 調用子類方法 3 c.parentMethod() # 調用父類方法 4 c.setAttr(200) # 再次調用父類方法,設置屬性 5 c.getAttr() # 再次調用父類方法 獲取屬性 6 c.myMethod() # 調用的是子類的MyMethod
能夠經過內置函數,判斷子類與類的關係,以下所示:
1 print(issubclass(Child, Parent)) # 判斷是不是對應的父子關係 2 print(isinstance(c, Child)) # 判斷是不是實例對象 3 print(isinstance(c, Parent)) # 判斷是不是實例對象
天淨沙·秋思