物件導向程式設計的基礎

2022-06-13 18:30:19 字數 4984 閱讀 7442

在python中可以使用class關鍵字定義類,然後在類中通過之前學習過的函式來定義方法,這樣就可以將物件的動態特徵描述出來,**如下所示。

class

student(object):

#__init__是乙個特殊方法用於在建立物件時進行初始化操作

#通過這個方法我們可以為學生物件繫結name 和 age兩個屬性

def__init__

(self, name, age):

self.name =name

self.age =age

defstudy(self, course_name):

print("

%s正在學習%s

" %(self.name, course_name))

#pep 8 要求識別符號的名字用全小寫多個單詞用下劃線連線

#但是部分程式設計師和公司更傾向於使用駝峰命名法(駝峰標識)

defwatch_movie(self):

if self.age < 18:

print("

%s只能**《熊出沒》。

" %self.name)

else

:

print("

%s正在**島國愛惜大電影。

" % self.name)

說明:寫在類中的函式,我們通常稱之為(物件的)方法,這些方法就是物件可以接收的訊息。

當我們定義好乙個類之後,可以通過下面的方式來建立物件並給物件發訊息。

def

main():

#建立學生物件並指定姓名和年齡

stu1 = student("

羅皓", 12)

#給物件發study訊息

stu1.study("

思想品德")

#給物件發watch_movie訊息

stu1.watch_movie()

stu2 = student("

大明", 23)

stu2.study(

"python程式程式設計")

stu2.watch_movie()

if__name__ == '

__main__':

main()

在很多物件導向程式設計語言中,我們通常會將物件的屬性設定為私有的(private)或受保護的(protected),簡單的說就是不允許外界訪問,而物件的方法通常都是公開的(public),因為公開的方法就是物件能夠接受的訊息。在python中,屬性和方法的訪問許可權只有兩種,也就是公開的和私有的,如果希望屬性是私有的,在給屬性命名時可以用兩個下劃線作為開頭,下面的**可以驗證這一點。

class

test:

def__init__

(self, foo):

self.

__foo =foo

def__bar

(self):

print(self.__foo

)

print("

__bar")

defmain():

test = test("

hello")

test.

__bar

()

#attributeerror: 'test' object has no attribute '__bar'

print(test.__foo

)

#attributeerror: 'test' object has no attribute '__foo'

if__name__ == '

__main__':

main()

但是,python並沒有從語法上嚴格保證私有屬性或方法的私密性,它只是給私有的屬性和方法換了乙個名字來妨礙對它們的訪問,事實上如果你知道更換名字的規則仍然可以訪問到它們,下面的**就可以驗證這一點。之所以這樣設定,可以用這樣一句名言加以解釋,就是"we are all consenting adults here"。因為絕大多數程式設計師都認為開放比封閉要好,而且程式設計師要自己為自己的行為負責。

class

test:

def__init__

(self, foo):

self.

__foo =foo

def__bar

(self):

print(self.__foo

)

print("

__bar")

defmain():

test = test("

hello")

test._test__bar()

print

(test._test__foo)

if__name__ == '

__main__':

main()

在實際開發中,我們並不建議將屬性設定為私有的,因為這會導致子類無法訪問(後面會講到)。所以大多數python程式設計師會遵循一種命名慣例就是讓屬性名以單下劃線開頭來表示屬性是受保護的,本類之外的**在訪問這樣的屬性時應該要保持慎重。這種做法並不是語法上的規則,單下劃線開頭的屬性和方法外界仍然是可以訪問的,所以更多的時候它是一種暗示或隱喻,關於這一點可以看看我的《python - 那些年我們踩過的那些坑》文章中的講解。

物件導向有三大支柱:封裝、繼承和多型。後面兩個概念在下乙個章節中進行詳細的說明,這裡我們先說一下什麼是封裝。我自己對封裝的理解是"隱藏一切可以隱藏的實現細節,只向外界暴露(提供)簡單的程式設計介面"。我們在類中定義的方法其實就是把資料和對資料的操作封裝起來了,在我們建立了物件之後,只需要給物件傳送乙個訊息(呼叫方法)就可以執行方法中的**,也就是說我們只需要知道方法的名字和傳入的引數(方法的外部檢視),而不需要知道方法內部的實現細節(方法的內部檢視)。

練習1  定義乙個類描述數字時鐘。

from time import

sleep

class

clock(object):

"""數字時鐘

"""def

__init__(self, hour=0, minute=0, second=0):

"""初始化方法

:param hour:時

:param minute:分

:param second:秒

"""self._hour =hour

self._minute =minute

self._second =second

defrun(self):

"""走字

"""self._second += 1

if self._second == 60:

self._second =0

self._minute += 1

if self._minute == 60:

self._minute =0

self._hour += 1

if self._hour == 24:

self._hour =0

defshow(self):

"""顯示時間

"""return

"%02d:%02d:%02d

" %\

(self._hour, self._minute, self._second)

#建立和使用物件

defmain():

clock = clock(23, 59, 58)

while

true:

print

(clock.show())

sleep(1)

clock.run()

if__name__ == '

__main__':

main()

練習2:定義乙個類描述平面上的點並提供移動點和計算到另乙個點距離的方法。

from math import

sqrt

class

point(object):

"""數字時鐘

"""def

__init__(self, x=0, y=0):

"""初始化方法

:param x:橫座標

:param y:縱座標

"""self.x =x

self.y =y

defmove_to(self, x, y):

"""移動到指定位置

:param x: 新的橫座標

:param y: 新的縱座標

"""self.x =x

self.y =y

defmove_by(self, dx, dy):

"""移動指定的增量

:param dx: 橫座標的增量

:param dy: 縱座標的增量

"""self.x +=dx

self.y +=dy

defdistance_to(self, other):

"""計算與另乙個點的距離

:param other: 另乙個點

"""dx = self.x -other.x

dy = self.y -other.y

return sqrt(dx ** 2 + dy ** 2)

def__str__

(self):

return

"(%s, %s)

" %(str(self.x), str(self.y))

#建立和使用物件

defmain():

p1 = point(3, 5)

p2 =point()

print

(p1)

print

(p2)

p2.move_by(-1, 2)

print

(p2)

print

(p1.distance_to(p2))

if__name__ == '

__main__':

main()

物件導向程式設計基礎

當類中的成員變數與成員方法中的引數重名時,使用this,來使用類中的成員變數 不用的話,就是成員方法中的引數 public class test public static void main string args 123 system.out.println this.name abc無參構造方...

物件導向程式設計基礎

類和物件 類是物件的藍圖和模板,物件是類的例項,物件是具體的東西,具有屬性和行為,每個物件都是獨一無二的,物件一定屬於某個類。當把一大堆具有共同特徵的物件的靜態特徵 屬性 和動態特徵 行為 都抽取出來後,就可以定義 出乙個叫做類的東西。定義類 在python中,用class來定義類,在類中用之前學過...

物件導向程式設計 基礎

特點 類是物件的資料型別 類是具有相同屬性和行為的一組物件的集合 屬性 描述物件特徵的資料 行為 描述物件能進行的操作 public class 類名 成員變數 屬性 成員方法 行為 建立物件 類名 物件名 new 類名 使用物件 使用成員變數 物件名.變數名 使用成員方法 物件名.方法名 引數列表...