什么是面向對象?
面向對象技術簡介
- 類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
- 方法:類中定義的函數。
- 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為實例變量使用。
- 數據成員:類變量或者實例變量用于處理類及其實例對象的相關的數據。
- 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
- 局部變量:定義在方法中的變量,只作用于當前實例的類。
- 實例變量:在類的聲明中,屬性是用變量來表示的。這種變量就稱為實例變量,是在類聲明的內部但是在類的其他成員方法之外聲明的。
-
繼承:即一個派生類(derived class)繼承基類(base
class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關系(例圖,Dog是一個Animal)。 - 實例化:創建一個類的實例,類的具體對象。
- 對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
面向對象一定要有類,以下介紹均基于類
類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
屬性,就是數據,包括類變量和實例變量
方法,就是操作數據的行為,包括實例方法、類方法和靜態方法
為什么要使用類呢?
每個類都是一個模板,統一存儲數據和操作數據的規則
每個類都是一個類別,基于這個類別管理數據,方便查找和操作
基于類可以實現繼承和多態,方便程序的擴展
類作為一個整體,把一組組相關數據放到類的實例里面,進行存儲,計算等,實現安全性、獨立性,規則的操作統一,保證數據的一致性和完整性。
什么是封裝?
將對象的數據與操作數據的方法相結合,通過方法將對象的數據與實現細節保護起來,就稱為封裝。外界只能通過對象的方法訪問對象,因此封裝同時也實現了對象的數據隱藏。通過封裝和數據隱藏機制,將一個對象相關的變量和方法封裝為一個獨立的軟件體,單獨進行實現和維護,并使對象能夠在系統內方便地進行傳遞,另外也保證了對象數據的一致性并使程序易于維護,封裝可以讓調用者不用關心對象是如何構建的而直接進行使用。
函數和類中的方法都可以實現封裝,那么他們有什么區別呢?
類:
專有數據(可以存儲,和對外使用)
方法(用于操作專有數據的),實現操作數據的規則。類實例不但有操作某些數據的過程和算法,且保存相關的數據
函數:
無專有數據,誰給他傳值都可以處理,并返回,函數只有操作某些數據的過程和算法,但本身不能存儲數據。
所以類和函數的區別在于是否保存數據
一個簡單的類的例子:
class P:
def __init__(self,value): #構造方法,初始化用的
self.value = value #value局部變量
#self.value叫做實例變量
p =P(10)
print(p.value) #打印10
兩個下劃線開頭的方法或者是變量,都是私有的。
私有的變量和方法,只能類內部的方法去調用,外部不可以
拿上面的例子說,如果是self.__value = value,print(p.__value),這樣就會報錯,因為外部不能使用類里的私有變量
類:
一組數據(可以是0個、1個或多個),以及提供操作這組數據的相關方法,數據和方法組成了類。
類定義的所有內容,在內存中僅有一份(類變量和類方法)
類實例(多個),每個類實例在內存中都有自己的空間。
類名全大寫
class PERSON(object):
def __init__(self,name,sex,height,weight,bachelor):
self.name = name
self.sex = sex
self.height = height
self.weight = weight
self.bachelor = True
def print_name(self):
print(self.name)
alex = PERSON("Alex","M",180,200,True)
mike = PERSON("Mike","M",101,250,False)
print(alex.weight)
print(mike.weight)
alex.weight += 1
print(alex.weight)
alex.print_name()
類的方法里面為啥要有個self呢?
alex.print_name()---->在內存中找到類定義所在的內存位置,找到類里面定義的方法print_name(),self—>alex所在的內存地址,使用alex實例中的name值進行打印。
類:存儲、管理、操作一組特定的數據的。通過私有變量和相應的操作方法,來保證數據的一致性和完整性。
保證數據的安全性有2種方法:
方法1:
設定私有變量__xxx,通過get_xxx()取數據,通過set_xxx賦值
取數據和設置數據的規則都在方法里。
__xxx是安全的,只能通過實例方法去訪問。
方法2:
使用公有變量,通過@property 來讀取數據,
通過@xxxx.setter來設置數據。
數據也是安全的,因為有2個方法來設定取數據和修改數據規則。
class Goods(object):
def __init__(self,pri):
self.pri = pri
@property
def price(self):
return int(self.pri)
@price.setter
def price(self, value):
if self.pri>=100 or self.pri<0:
return None
@price.deleter
def price(self):
print("價格變量被刪除了!")
del self.pri
#調用
obj = Goods(50.50)
print(obj.price) # 自動執行 @property 修飾的 price 方法,并獲取方法的返回值,打印50
obj.price = 123 # 自動執行 @price.setter 修飾的 price 方法,并將 123 賦值給方法的參數
print(obj.price) #打印50
del obj.price # 自動執行 @price.deleter 修飾的 price 方法,打印 價格變量被刪除了!
類的特殊成員
1.__doc__表示類的描述信息
2.__module__表示當前操作的對象在哪個模塊
3.__class__表示當前操作的對象的類是什么
4.__del__析構方法,當對象在內存中被釋放時,自動觸發執行
注:此方法一般無須定義,因為Python是一門高級語言,程序員在使用時無需關系內存的分配和釋放,因為此工作都是交給Python解釋器來執行,所以,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。
5.__call__對象后面加括號,觸發執行
注:構造方法的執行是由創建對象觸發的,即:對象=類名();而對于__call__方法的執行是由對象后加括號觸發的,即:對象()或類()()
6.__dict__類或對象中的所有成員
類的普通字段屬于對象;類中的靜態字段和方法等屬于類
7.__str__如果一個類中定義了__str__方法,那么在打印對象時,默認輸出該方法的返回值。
8.
getitem
、
setitem
、__delitem__用于索引操作,如字典。以上分別表示獲取、設置、刪除數據
9.
getslice
、
setslice
、
delslice__在python2.7可以使用,在3.x已經被去掉了,需要使用__getitem
、
setitem
、__delitem__和__getslice__來實現
10.
iter__用于迭代器,之所以列表、字段、元組可以進行for循環,是因為類型內部定義了__iter
11.__slot__限制實例可以使用的屬性名稱
12.__metaclass__用途較少
13.__new__在類準備將自身實例化時調用,
new
()方式始終都是類的靜態方法,即使沒有被加上靜態方法裝飾器
類實現了如下方法,就是可以迭代的對象
iter
()
next
()
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
