天天看點

python面向對象--類和對象python面向對象–類和對象

python面向對象–類和對象

一. 一些基本概念

  1. 類:用來描述具有相同的屬性和方法的對象的集合,它定義了該集合中每個對象所共有的屬性和方法,對象是類的執行個體
  2. 類變量:類變量在整個執行個體化的對象中是公用的,類變量定義在類中且在函數體之外,類變量通常不作為執行個體變量使用
  3. 資料成員:類變量和執行個體變量,用于處理類及其執行個體對象的相關的資料
  4. 方法重寫:如果從父類繼承的方法 不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆寫,也稱為方法的重寫
  5. 局部變量:定義在方法中的變量,隻作用于目前執行個體的類
  6. 執行個體變量:在類的聲明中,屬性是用變量來表示的,這種變量就稱為執行個體變量,是在類聲明的内部但是在類的其他成員方法之外聲明的
  7. 繼承:即一個派生類繼承基類的字段和方法,繼承也允許吧一個派生類的對象作為一個基類對象對待,
  8. 執行個體化:建立一個類執行個體,類的具體對象
  9. 方法:類中定義的函數
  10. 對象:通過類定義的資料結構執行個體,對象包括兩個資料成員(類變量和執行個體變量) 和方法

三. python對象銷毀(垃圾回收)

python使用了引用計數這個簡單技術來跟蹤和回收垃圾

在python内部記錄着所有使用中的對象各有多少引用

一個内部跟蹤變量,稱為一個引用計數器

當對象被建立時,就建立了一個引用計數,當這個對象不再需要時,也就是說,這個對象的引用計數變為0時,它被垃圾回收,但是回收不是’立即’的,又解釋器在适當的時機,将垃圾對象占用的記憶體空間回收

a = 40  # 建立對象<40>
b = a # 建立引用,<40>的計數
c = [b]  #增加引用,<40>的計數

del a    #減少引用<40>的計數
b = 100  #減少引用<40>的計數
c[0] = -1  #減少引用<40>的計數
           

垃圾回收機制不僅針對引用計數為0的對象,同樣也可以處理循環引用的情況.循環引用指的是,兩個對象互相引用,但是沒有其他變量引用它們.在這種情況下,僅使用引用計數是不夠的.python的垃圾收集器實際上是一個引用計數器和一個循環垃圾收集器.作為引用計數的補充,垃圾收集器也會留心被配置設定的總量很大(及未通過引用計數器銷毀的那些)的對象,在這種情況下,解釋器會暫停下來,試圖清理所有未引用的循環

# -*- coding: utf-8 -*-

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, "ruin.....")
        
pt1 = Point()
pt2 = pt1
pt3 = pt1
print('pt11111111', id(pt1), id(pt2), id(pt3))
del pt3


'''output
pt11111111 2032686524616 2032686524616 2032686524616
Point ruin.....

'''
           

四. 類的繼承

面向對象的程式設計帶來的主要好處是代碼的重用,實作這種重用的方法之一是通過繼承機制

通過繼承建立的新類稱為子類或者派生類,被繼承的類稱為基類,父類或者超類

類的繼承的一些特點:

  1. 如果在子類這個需要父類的構造方法就需要顯式的調用父類的構造方法,或者不重寫父類的構造方法,
  2. 在調用基類的方法時,需要加上基類的類名字首,且需要帶上self參數變量,差別在于類中調用普通函數時并不需要帶上self參數
  3. python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找,(現在本類中查找調用的方法,找不到才到基類中去找)

五. 方法重寫

class Parent(object):
	"""docstring for Parent"""
	def myMethod(self):
		print('調用父類方法')
		

class Child(object):
	"""docstring for Child"""
	def myMethod(self):
		print('調用子類方法')
		
c=Child()
c.myMethod()

"""output
調用子類方法
"""
           

基礎重載方法

# 以下是一些通用的功能,可以在自己的類重寫
__init__(self[,args]) 構造函數,調用方法:obj = className(args)

__del__(self)  析構方法,删除一個對象,調用方法:del obj

__repr__(self)  轉化為供解釋器讀取的形式,調用方法:repr(obj)

__str__(self)  用于轉化為适于人閱讀的形式,調用方法:str(obj)
__cmp__(self, x) 對象比較,調用方法:cmp(obj,x)  
           

運算符重載

__add__(self)
           

六. 類屬性和方法

類的私有屬性:兩個下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接通路,在類内部的方法中使用時self.__private_attrs

類的私有方法:private_method,兩個下劃線開頭,聲明該方法為私有方法,不能在類的外部調用,在類的内部調用

self.__private_methods
           
# print('22222222', j.__secretCount)  #直接通路不了
# 用obj._className.__secretvariablename來通路私有屬性
print('22222222', j._JustCounter__secretCount)
           

ps:單下劃線 雙下劃綫 頭尾雙下劃綫說明

__foo__定義的是特殊方法,一般是系統定義名字,類似__init__()之類的
_foo 以單下劃線開頭的表示的是protected類型的變量,即保護類型隻允許本身和子類進行通路,不能用于from module import *

__foo  雙下劃線的表示的是私有類型的變量,隻能是允許這個類本身進行通路了
           
python面向對象--類和對象python面向對象–類和對象

護類型隻允許本身和子類進行通路,不能用于from module import *

__foo 雙下劃線的表示的是私有類型的變量,隻能是允許這個類本身進行通路了

[外鍊圖檔轉存中...(img-V5n48TiK-1599124345172)]