python學習筆記之——python面向對象

Python是一門面向對象語言。python

一、面向對象技術介紹編程

  • 類(Class): 用來描述具備相同的屬性和方法的對象的集合。它定義了該集合中每一個對象所共有的屬性和方法。對象是類的實例。
  • 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體以外。類變量一般不做爲實例變量使用。
  • 數據成員:類變量或者實例變量。用於處理類及其實例對象的相關的數據。
  • 方法重寫:若是從父類繼承的方法不能知足子類的需求,能夠對其進行改寫,這個過程叫方法的覆蓋(override),也稱爲方法的重寫。
  • 實例變量:定義在方法中的變量,只做用於當前實例的類。
  • 繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也容許把一個派生類的對象做爲一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。
  • 實例化:建立一個類的實例,類的具體對象。
  • 方法:類中定義的函數。
  • 對象:對象是類的實例,經過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。

二、建立python類數據結構

python使用 class 語句來建立一個新類,class 以後爲類的名稱並以冒號結尾:編程語言

class ClassName:
   '類的幫助信息'   #類文檔字符串
   class_suite  #類體

類的幫助信息能夠經過ClassName.__doc__查看。ide

class_suite 由類成員,方法,數據屬性組成。函數

python類舉例:ui

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Employee:
   '全部員工的基類'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
  • empCount 變量是一個類變量,它的值將在這個類的全部實例之間共享。你能夠在內部類或外部類使用 Employee.empCount 訪問。spa

  • 第一個方法__init__()方法是一種特殊的方法,被稱爲類的構造函數或初始化方法,當建立了這個類的實例時就會調用該方法設計

  • self 表明類的實例,self 在定義類的方法時是必須有的,雖然在調用時沒必要傳入相應的參數。code

三、建立類的實例對象

實例化類其餘編程語言中通常用關鍵字 new,可是在 Python 中並無這個關鍵字,類的實例化相似函數調用方式。

如下使用類的名稱 Employee 來實例化,並經過 __init__ 方法接受參數。

您可使用點(.)來訪問對象的屬性。

舉例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Employee:
   '全部員工的基類'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
 
"建立 Employee 類的第一個對象"
emp1 = Employee("Zara", 2000)
"建立 Employee 類的第二個對象"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

執行結果:

Name :  Zara ,Salary:  2000
Name :  Manni ,Salary:  5000
Total Employee 2

四、python內置類屬性

  • __dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)
  • __doc__ :類的文檔字符串
  • __name__: 類名
  • __module__: 類定義所在的模塊(類的全名是'__main__.className',若是類位於一個導入模塊mymod中,那麼className.__module__ 等於 mymod)
  • __bases__ : 類的全部父類構成元素(包含了一個由全部父類組成的元組)

Python內置類屬性調用實例以下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Employee:
   '全部員工的基類'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
 
print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__

執行結果:

Employee.__doc__: 全部員工的基類
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x00000000027664A8>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x0000000002766518>, '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': <function __init__ at 0x0000000002766438>}

 五、python類的繼承

繼承語法 :

#基類名寫在括號裏,基本類是在類定義的時候,在元組之中指明的。在繼承元組中列了一個以上的類,那麼它就被稱做"多重繼承"
class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite

在python中繼承中的一些特色:

  • 在繼承中基類的構造(__init__()方法)不會被自動調用,它須要在其派生類的構造中親自專門調用。
  • 在調用基類的方法時,須要加上基類的類名前綴,且須要帶上self參數變量。區別在於類中調用普通函數時並不須要帶上self參數
  • Python老是首先查找對應類型的方法,若是它不能在派生類中找到對應的方法,它纔開始到基類中逐個查找。(先在本類中查找調用的方法,找不到纔去基類中找)。

舉例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

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 '調用子類方法'

    def childMethod1(self):
        Parent.parentMethod(self) #這個是子類中調用父類方法,參數必定要加上self

c = Child()  # 實例化子類
c.childMethod()  # 調用子類的方法
c.parentMethod()  # 調用父類方法
c.childMethod1()
c.setAttr(200)  # 再次調用父類的方法 - 設置屬性值
c.getAttr()  # 再次調用父類的方法 - 獲取屬性值

執行結果:

調用子類構造方法
調用子類方法
調用父類方法
調用父類方法
父類屬性 : 200

六、python方法重寫

若是你的父類方法的功能不能知足你的需求,你能夠在子類重寫你父類的方法

舉例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Parent:  # 定義父類
    def myMethod(self):
        print '調用父類方法'


class Child(Parent):  # 定義子類
    def myMethod(self):
        print '調用子類方法'

c = Child()  # 子類實例
c.myMethod()  # 子類調用重寫方法

執行結果:

調用子類方法

七、python類屬性和方法

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

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

舉例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class JustCounter:
    __secretCount = 0  # 私有變量
    publicCount = 0  # 公開變量

    def publiccount(self):# 公共方法
        self.__secretCount += 1
        self.publicCount += 1
        print self.__secretCount

    def __secretcount1(self):# 私有方法
        self.__secretCount += 1
        self.publicCount += 1
        print self.__secretCount

counter = JustCounter()
counter.publiccount()
counter._JustCounter__secretcount1()
print counter.publicCount
print counter._JustCounter__secretCount
printcounter.__secretCount# # 報錯,實例不能訪問私有變量

執行結果:

C:\Users\sea\PycharmProjects\test1\venv\Scripts\python.exe C:/Users/sea/PycharmProjects/test1/testfile1.py
Traceback (most recent call last):
  File "C:/Users/sea/PycharmProjects/test1/testfile1.py", line 23, in <module>
    printcounter.__secretCount# # 報錯,實例不能訪問私有變量
NameError: name 'printcounter' is not defined
1
2
2
2

八、python類的方法和屬性單下劃線、雙下劃線、頭尾雙下劃線說明

  • __foo__: 定義的是特殊方法,通常是系統定義名字 ,相似 __init__() 之類的。

  • _foo: 以單下劃線開頭的表示的是 protected 類型的變量,即保護類型只能容許其自己與子類進行訪問,不能用於 from module import *

  • __foo: 雙下劃線的表示的是私有類型(private)的變量, 只能是容許這個類自己進行訪問了。

相關文章
相關標籤/搜索