物件導向:以日常生活的角度思考問題的解決,更接近人的思維方式,讓人可以從更高的層面考慮系統的構建
以你請朋友吃飯為例:
面向過程
物件導向
自己買菜
和朋友一塊到飯店
自己摘菜
叫服務員點菜
自己洗菜
和朋友一塊吃
自己做菜
和朋友一塊吃
物件導向的優點:
物件導向是一種思維方式,它認為萬事萬物皆物件,程式是由多個物件協作共同完成功能的,所以以後我們要從面向過程轉向物件導向。以物件導向的方式考慮程式的構建。物件導向的核心是:類和物件
問題->物件導向分析(ooa)->發現物件->類->用類例項化物件->物件協作完成功能
生活角度
類: 汽車 超級英雄 電腦 杯子
物件: 紅色的寶馬 美國隊長 桌上的mac pro 老王的黑色杯子
程式角度
類:
成員屬性(成員變數) 描述物件的靜態特徵,諸如,名字、身高體重
成員方法 描述物件的動態特徵,例如:吃飯、睡覺、打豆豆
#語法:
class 類名:
類體
注意:
成員方法其實就是函式,作用域在類內,成員方法的第乙個引數必須是self,self代表當前物件,也就是呼叫這個方法的物件,這個引數由系統傳遞。
class
dog(
object):
defbark
(self)
:#成員方法,第乙個引數必須是self,代表當前呼叫物件
print
('我是小可愛--丁丁'
)dingding = dog(
)#例項化乙個物件
#呼叫方法,不需要傳引數,self是系統傳遞的
#呼叫形式: 物件.方法([實參])
dingding.bark(
)#等價呼叫形式:bark(dingding)
注意:
方法的第乙個引數self其實可以使任何合法識別符號,不過一般約定俗成都是self
方法的連貫呼叫
class dog:
def bark(self):
print("汪汪汪")
return self #返回self
def eat(self):
print("愛啃大骨頭")
return self
dog = dog()
dog.eat().bark() #方法的連貫呼叫
物件的建立過程也稱之為物件的例項化過程,也就是定義了乙個類型別的變數或者稱之為例項(instance)的過程
#語法: 物件 = 類名([實參])
dingding = dog() #例項化乙個物件
print(dingding) #<__main__.dog object at 0x00000000023f40b8>
print(type(dingding)) ##檢視物件的類名
print(dingding.__class__)
成員屬性描述的是物件的靜態特徵,比如說狗名字、品種等,其實就是乙個變數,作用域屬於類,不會和類外的全域性變數衝突。python中成員屬性可以動態新增,也可以在建構函式中新增。成員屬性屬於物件,每個物件的成員屬性的值都不同
#新增屬性語法:
物件.成員屬性 = 值
#引用方式:物件.成員屬性
class dog(object):
__slots__ = ('gender','name','age','kind') #這個類的物件這能有這些屬性
def __init__(self,name,kind,age):
self.name = name
self.kind = kind
self.age = age
def bark(tmp):
print('我是小可愛--丁丁')
dingding = dog('丁丁','泰迪',3)
print('我是可愛的%s犬,%s,我今年%d歲了' % (dingding.kind, dingding.name, dingding.age))
dingding.gender = '公' #動態新增的屬性
#dingding.weight = 8 #不能新增這個屬性,語法錯誤
#檢視例項屬性
print(dingding.__dict__) #__dict__屬性可以用來檢視例項屬性
print(dir(dingding)) #檢視dog的屬性,包括例項屬性
隱藏物件的屬性和實現細節,僅對外公開介面,控制在程式中屬性的讀取和修改的訪問級別。
類本身就是一種封裝,通過類可以將資料(屬性)和行為(方法)相結合,形成乙個有機的整體,也就是將資料與對資料的操作有機的結合。封裝的目的是增強安全性和簡化程式設計,使用者不必了解具體的實現細節,而只是要通過外部介面,以特定的訪問許可權來使用類的成員。成員私有化是實現封裝的手段。所有的成員預設是公有。
如果想讓類的內部屬性不被外界直接訪問,可以在這個屬性的前面加兩個下劃線__ ,在python中,如果乙個屬性的前面出現 __,就表示這個屬性只能在當前類的方法中被直接訪問,不能通過物件直接訪問,這個變數就被稱為私有變數
class dog:
def __init__(self,name,gender,age):
self.name = name
self._gender = gender #'保護'變數
self.__age = age #私有變數
#定義乙個公開的方法,間接訪問私有變數
def get_age(self):
return self.__age
#定義乙個公開方法,間接設定私有變數
def set_age(self,age):
self.__age = age
ding = dog('丁丁','公',5)
print(ding.name)
# print(ding.__age) #attributeerror: 'dog' object has no attribute '__age'
print(ding.get_age()) #5 獲取私有屬性的值
ding.set_age(10) #設定私有屬性的值
print(ding.get_age()) #10
print(ding._gender)
#可以通過 _dog__age訪問私有變數,但不建議
print(ding._dog__age)
【面試題】
常見的在變數的前後加下劃線的問題:
單下劃線:_age ----->受保護的 可以訪問,當約定俗稱,當你看到乙個下劃線開頭的成員時不應該使用它
雙下劃線:__age ------>私有的
兩邊都雙下劃線:__age__ ------->系統內建變數
對於私有屬性的訪問,使用公開方法間接訪問的方法太麻煩,python提供了一種便捷語法,屬性裝飾器,通過屬性裝飾器,可以很方便的對私有屬性進訪問,屬性修飾器可以把方法屬性化。
class dog:
def __init__(self,name,gender,age):
self.name = name
self._gender = gender
self.__age = age
@property
def age(self):
return self.__age
@age.setter
def age(self,age):
self.__age =age
ding = dog('丁丁','公',5)
print(ding.name)
print(ding.age)
ding.age =10
print(ding.age)
print(ding._gender)
如果對乙個方法的名字前面加__,宣告該方法為私有方法,只能在當前類中被呼叫,在外界不能通過物件直接呼叫,這就是私有方法
class dog:
def __init__(self,name,age):
self.name = name
self.age = age
def __pee(self):
print('這是我的地頭')
dog = dog('dingding',5)
#dog.__pee() #attributeerror: 'dog' object has no attribute '__pee'
注意:
__repr__
作用同__str__
,不過是給直譯器看的
class animal:
def __init__(self,name,age):
self.name = name
self.__age =age
def __str__(self):
return "name : {} age : {}".format(self.name,self.__age)
def __repr__(self):
return self.__str__()
a1 = animal('zhu',3)
print(a1)
print('我是一頭可愛的 ' + str(a1)
Python類和物件
1 建立類 語法 class classname 類的幫助資訊 類文件字串 class suite 類體 例如 class employee 所有員工的基類 empcount 0 def init self,name,salary self.name name self.salary salary ...
Python類和物件
python類和物件 類 具有相同的屬性和方法的物件的集合。物件 萬物皆物件。類和物件的關係 類是具有相同屬性方法物件的集合。類包含屬性和方法 語法 class 類名 屬性 方法定義乙個類 建立物件 屬性寫在類外的情況,就是通過物件,屬性,物件,方法的方式呼叫。屬性相對於類來說屬於全域性,每個方法都...
Python類和物件
類和物件 類 class 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類 的例項。方法 類中定義的函式。類變數 類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。方法重寫 如果從父類繼承的方法不能滿足子類...