Python OOP

面向對象技術簡介

class Employee:
    '全部員工的基類'
    empCount = 0 #empCount 變量是一個類變量,它的值將在這個類的全部實例之間共享。你能夠在內部類或外部類使用 Employee.empCount 訪問。
    #類的初始方法,類的構造函數
    #self 表明類的實例,self 在定義類的方法時是必須有的,雖然在調用時沒必要傳入相應的參數
    #name salary 實例對象,訪問時須要self.name
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1
        #類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self。
    def displayCount(self):
         print("Total Employee %d" % Employee.empCount) #訪問類對象
         print("say:{0}{1}".format(self.name,self.salary))  #訪問實例對象

#建立類的實例
e=Employee("劉德華","酷斃了")
#調用實例方法
e.displayCount()
#第二個實例
ee=Employee("彭于晏","智商190")
ee.displayCount()

#屬性操做
e.age = 7  # 添加一個 'age' 屬性
e.age = 8  # 修改 'age' 屬性
del e.age  # 刪除 'age' 屬性
print(hasattr(e, 'age'))    # 若是存在 'age' 屬性返回 True。
print(setattr(e, 'age', 8)) # 添加屬性 'age' 值爲 8
print(getattr(e, 'age'))    # 返回 'age' 屬性的值
print(delattr(e, 'age'))    # 刪除屬性 'age'

print ("類的文檔字符串Employee.__doc__:", Employee.__doc__)
print ("類名Employee.__name__:", Employee.__name__)
#類的全名是'__main__.className',若是類位於一個導入模塊mymod中,那麼className.__module__ 等於 mymod
print ("類定義所在的模塊Employee.__module__:", Employee.__module__)
print ("類的全部父類構成元素Employee.__bases__:", Employee.__bases__)
print ("類的屬性Employee.__dict__:", Employee.__dict__)

python對象銷燬(垃圾回收)

  • Python 使用了引用計數這一簡單技術來跟蹤和回收垃圾。在 Python 內部記錄着全部使用中的對象各有多少引用。一個內部跟蹤變量,稱爲一個引用計數器。
    當對象被建立時, 就建立了一個引用計數, 當這個對象再也不須要時, 也就是說, 這個對象的引用計數變爲0 時, 它被垃圾回收。可是回收不是"當即"的, 由解釋器在適當的時機,將垃圾對象佔用的內存空間回收
  • 垃圾回收機制不只針對引用計數爲0的對象,一樣也能夠處理循環引用的狀況。循環引用指的是,兩個對象相互引用,可是沒有其餘變量引用他們。這種狀況下,僅使用引用計數是不夠的。Python 的垃圾收集器其實是一個引用計數器和一個循環垃圾收集器。做爲引用計數的補充, 垃圾收集器也會留心被分配的總量很大(及未經過引用計數銷燬的那些)的對象。 在這種狀況下, 解釋器會暫停下來, 試圖清理全部未引用的循環
  • 析構函數 del ,__del__在對象銷燬的時候被調用,當對象再也不被使用時,__del__方法運行:
class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "銷燬"
 
pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # 打印對象的id
del pt1
del pt2
del pt3

繼承

承語法 class 派生類名(基類名)://... 基類名寫在括號裏,基本類是在類定義的時候,在元組之中指明的。python

class Parent:        # 定義父類
   parentAttr = 100
   def __init__(self):
      print "調用父類構造函數"
 
   def parentMethod(self):
      print '調用父類方法'
 
   def setAttr(self, attr):
      Parent.parentAttr = attr
 
   def getAttr(self):
      print "父類屬性 :", Parent.parentAttr
 
class Child(Parent): # 定義子類
   def __init__(self):
      print "調用子類構造方法"
 
   def childMethod(self):
      print '調用子類方法 child method'
 
c = Child()          # 實例化子類
c.childMethod()      # 調用子類的方法
c.parentMethod()     # 調用父類方法
c.setAttr(200)       # 再次調用父類的方法
c.getAttr()          # 再次調用父類的方法

你能夠繼承多個類:函數

class C(A, B): # 繼承類 A 和 Bcode

你可使用issubclass()或者isinstance()方法來檢測。orm

  • issubclass() - 布爾函數判斷一個類是另外一個類的子類或者子孫類,語法:issubclass(sub,sup)
  • isinstance(obj, Class) 布爾函數若是obj是Class類的實例對象或者是一個Class子類的實例對象則返回true。

方法重寫

class Parent:        # 定義父類
   def myMethod(self):
      print '調用父類方法'
 
class Child(Parent): # 定義子類
   def myMethod(self):
      print '調用子類方法'
 
c = Child()          # 子類實例
c.myMethod()         # 子類調用重寫方法

類屬性與方法

  • 私有屬性: __private_attrs:兩個下劃線開頭,聲明該屬性爲私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs。
  • 在類的內部,使用 def關鍵字能夠爲類定義一個方法,與通常函數定義不一樣,類方法必須包含參數 self,且爲第一個參數
    -類的私有方法: __private_method:兩個下劃線開頭,聲明該方法爲私有方法,不能在類地外部調用。在類的內部調用 self.__private_methods

Python不容許實例化的類訪問私有數據,但你可使用 object._className__attrName 訪問屬性對象

訪問修飾符

單下劃線、雙下劃線、頭尾雙下劃線說明:繼承

  • __foo__: 定義的是特列方法,相似 init() 之類的。
  • _foo: 以單下劃線開頭的表示的是 protected 類型的變量,即保護類型只能容許其自己與子類進行訪問,不能用於 from module import *
  • __foo: 雙下劃線的表示的是私有類型(private)的變量, 只能是容許這個類自己進行訪問了。
相關文章
相關標籤/搜索