Python類和物件

2021-10-10 17:40:23 字數 4830 閱讀 4475

物件導向:以日常生活的角度思考問題的解決,更接近人的思維方式,讓人可以從更高的層面考慮系統的構建

以你請朋友吃飯為例:

面向過程

物件導向

自己買菜

和朋友一塊到飯店

自己摘菜

叫服務員點菜

自己洗菜

和朋友一塊吃

自己做菜

和朋友一塊吃

物件導向的優點:

物件導向是一種思維方式,它認為萬事萬物皆物件,程式是由多個物件協作共同完成功能的,所以以後我們要從面向過程轉向物件導向。以物件導向的方式考慮程式的構建。物件導向的核心是:類和物件

問題->物件導向分析(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 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類 的例項。方法 類中定義的函式。類變數 類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。方法重寫 如果從父類繼承的方法不能滿足子類...