您好,登錄后才能下訂單哦!
這篇文章主要介紹python中類和對象的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
類和對象
簡單的說,類是對象的藍圖和模板,而對象是類的實例。這個解釋雖然有點像用概念在解釋概念,但是從這句話我們至少可以看出,類是抽象的概念,而對象是具體的東西。在面向對象編程的世界中,一切皆為對象,對象都有屬性和行為,每個對象都是獨一無二的,而且對象一定屬于某個類(型)。當我們把一大堆擁有共同特征的對象的靜態特征(屬性)和動態特征(行為)都抽取出來后,就可以定義出一個叫做“類”的東西。
定義類
在Python中可以使用class關鍵字定義類,然后在類中通過之前學習過的函數來定義方法,這樣就可以將對象的動態特征描述出來,代碼如下所示。
class Student(object): # __init__是一個特殊方法用于在創建對象時進行初始化操作 # 通過這個方法我們可以為學生對象綁定name和age兩個屬性 def __init__(self, name, age): self.name = name self.age = age def study(self, course_name): print('%s正在學習%s.' % (self.name, course_name)) # PEP 8要求標識符的名字用全小寫多個單詞用下劃線連接 # 但是很多程序員和公司更傾向于使用駝峰命名法(駝峰標識) def watch_av(self): if self.age < 18: print('%s只能觀看《熊出沒》.' % self.name) else: print('%s正在觀看島國愛情動作片.' % self.name)
說明: 寫在類中的函數,我們通常稱之為(對象的)方法,這些方法就是對象可以接收的消息。
創建和使用對象
當我們定義好一個類之后,可以通過下面的方式來創建對象并給對象發消息。
def main(): # 創建學生對象并指定姓名和年齡 stu1 = Student('駱昊', 38) # 給對象發study消息 stu1.study('Python程序設計') # 給對象發watch_av消息 stu1.watch_av() stu2 = Student('王大錘', 15) stu2.study('思想品德') stu2.watch_av() if __name__ == '__main__': main()
訪問可見性問題
對于上面的代碼,有C++、Java、C#等編程經驗的程序員可能會問,我們給Student對象綁定的name和age屬性到底具有怎樣的訪問權限(也稱為可見性)。因為在很多面向對象編程語言中,我們通常會將對象的屬性設置為私有的(private)或受保護的(protected),簡單的說就是不允許外界訪問,而對象的方法通常都是公開的(public),因為公開的方法就是對象能夠接受的消息。在Python中,屬性和方法的訪問權限只有兩種,也就是公開的和私有的,如果希望屬性是私有的,在給屬性命名時可以用兩個下劃線作為開頭,下面的代碼可以驗證這一點。
class Test: def __init__(self, foo): self.__foo = foo def __bar(self): print(self.__foo) print('__bar') def main(): test = Test('hello') # AttributeError: 'Test' object has no attribute '__bar' test.__bar() # AttributeError: 'Test' object has no attribute '__foo' print(test.__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') def main(): test = Test('hello') test._Test__bar() print(test._Test__foo) if __name__ == "__main__": main()
在實際開發中,我們并不建議將屬性設置為私有的,因為這會導致子類無法訪問(后面會講到)。所以大多數Python程序員會遵循一種命名慣例就是讓屬性名以單下劃線開頭來表示屬性是受保護的,本類之外的代碼在訪問這樣的屬性時應該要保持慎重。這種做法并不是語法上的規則,單下劃線開頭的屬性和方法外界仍然是可以訪問的,所以更多的時候它是一種暗示或隱喻
面向對象的支柱
面向對象有三大支柱:封裝、繼承和多態。后面兩個概念在下一個章節中進行詳細的說明,這里我們先說一下什么是封裝。我自己對封裝的理解是“隱藏一切可以隱藏的實現細節,只向外界暴露(提供)簡單的編程接口”。我們在類中定義的方法其實就是把數據和對數據的操作封裝起來了,在我們創建了對象之后,只需要給對象發送一個消息(調用方法)就可以執行方法中的代碼,也就是說我們只需要知道方法的名字和傳入的參數(方法的外部視圖),而不需要知道方法內部的實現細節(方法的內部視圖)。
練習
練習1:定義一個類描述數字時鐘
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 def run(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 def show(self): """顯示時間""" return '%02d:%02d:%02d' % \ (self._hour, self._minute, self._second) def main(): 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 def move_to(self, x, y): """移動到指定位置 :param x: 新的橫坐標 "param y: 新的縱坐標 """ self.x = x self.y = y def move_by(self, dx, dy): """移動指定的增量 :param dx: 橫坐標的增量 "param dy: 縱坐標的增量 """ self.x += dx self.y += dy def distance_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)) def main(): 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()
以上是“python中類和對象的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。