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


Python是一門面向對象語言。

1、面向對象技術介紹

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

2、創建python類

python使用 class 語句來創建一個新類,class 之后為類的名稱並以冒號結尾:

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

類的幫助信息可以通過ClassName.__doc__查看。

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

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
  • empCount 變量是一個類變量,它的值將在這個類的所有實例之間共享。你可以在內部類或外部類使用 Employee.empCount 訪問。

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

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

3、創建類的實例對象

實例化類其他編程語言中一般用關鍵字 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

4、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>}

 5、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

6、python方法重寫

如果你的父類方法的功能不能滿足你的需求,你可以在子類重寫你父類的方法

舉例:

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

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


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

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

執行結果:

調用子類方法

7、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

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

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

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

  • __foo: 雙下划線的表示的是私有類型(private)的變量, 只能是允許這個類本身進行訪問了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM