2018年的最後一天。
回顧這一年,得到不少也失去不少。
今年去了不少的地方,成都,重慶,峨眉山,天津,杭州,南京。
杭州是我特別喜歡的城市,有不少美好的記憶,也有不少失落的時刻。
南京如今算是個人一個治癒城市了,帶着重重的悲傷去,幸虧落雪的瞬間將我治癒。
今年努力回溫了不少次的這兩年,發現不少事情都在最先的時候就有預知,我能夠努力作好的事情卻沒有作到,這就是爲何我會揹負悲傷的緣由。
2019年,要更加努力,想作到的事情就必定要作到。
而後祝福我愛的人,一切都好。
但願有緣,還能再度相見吧。編程
2019年,世界和平,平安喜樂。函數
恩今天的雞血針劑,仍是用同一管吧~
每個優秀的人,都有一段沉默的時光。那一段時光,是付出了不少努力,忍受孤獨和寂寞,不抱怨,不訴苦,往後提及時,連本身都能被感動的日子。學習
面向對象最重要的概念就是類(Class)和實例(Instance),必須牢記 類是抽象的模板,好比Student類,而實例是根據類建立出來的一個個具體的「對象」,每一個對象都擁有相同的方法,但各自的數據可能不一樣。
class
關鍵字來定義類。
定義好後就能夠建立實例,而後後自由的給一個實例變量綁定屬性。code
由於類能夠起到模板的做用,因此在建立實例的時候,能夠綁定一些必要的屬性。用__init__
方法。對象
class Student(object): def __init__(self, name, score): self.name = name self.score = score
注意到__init__
方法的第一個參數永遠是self
,表示建立的實例自己,所以,在__init__方法內部,就能夠把各類屬性綁定到self,由於self就指向建立的實例自己。
訪問實例的數據的時候,由於數據自己就屬於實例,因此就不須要外部數據去訪問。
在類的內部定義好這些訪問數據的函數,就能夠「封裝」數據了——類的方法。繼承
class Student(object): def __init__(self, name, score): self.name = name self.score = score def print_score(self): print('%s: %s' % (self.name, self.score)) bart = Student() bart.print_score() #自帶的函數,調用的時候很方便,不須要知道內部數據的定義
爲了讓內部屬性不被外部訪問,就在屬性的名稱前__
(2個下劃線),而後就變成了私有變量。字符串
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score))
這樣外部就不能訪問__name
和__score
了,由於外部代碼不能隨意修改對象內部的狀態,代碼健壯多啦!
若是涉及到須要外部代碼修改或者訪問私有變量的話,能夠在類裏面增長方法。
這樣在傳參以前能夠先作驗證,保證傳入的參數可用。it
須要注意的是,在Python中,變量名相似__xxx__的,也就是以雙下劃線開頭,而且以雙下劃線結尾的,是特殊變量,特殊變量是能夠直接訪問的,不是private變量。有些時候,你會看到以
一個下劃線
開頭的實例變量名,好比_name,這樣的實例變量外部是能夠訪問的,可是,按照約定俗成的規定,當你看到這樣的變量時,意思就是,「雖然我能夠被訪問,可是,請把我視爲私有變量,不要隨意訪問」。面向對象編程
繼承就是從現有的類進行繼承,被繼承的爲超類或者父類(Base class、Super class)(也就是爸爸),新的類爲子類(Subclass)。模板
class Animal(object): def run(self): print('Animal is running....') #如下爲兩個子類 class Dog(Animal): pass class Cat(Animal): pass
當子類和父類都存在相同的方法的時候,子類的方法覆蓋了父類的,在代碼運行的時候,老是會調用子類的方法,這就是多態。
在子類建立實例的時候,不只具有了子類的數據類型,一樣也繼承了父類的數據類型,因此子類的實例可能存在多個數據類型。
但反過來的規則則不成立。
對於一個變量,咱們只須要知道它是Animal類型,無需確切地知道它的子類型,就能夠放心地調用run()方法,而具體調用的run()方法是做用在Animal、Dog、Cat仍是Tortoise對象上,由運行時該對象的確切類型決定,這就是多態真正的威力:調用方只管調用,無論細節,而當咱們新增一種Animal的子類時,只要確保run()方法編寫正確,不用管原來的代碼是如何調用的。這就是著名的「開閉」原則:
對擴展開放:容許新增Animal子類;
對修改封閉:不須要修改依賴Animal類型的run_twice()等函數。
動態語言的「鴨子類型」。
靜態語言不限制傳入的類型,只須要保證傳入的對象有相應的方法便可。
Python的「file-like object「就是一種鴨子類型。
這個還蠻特別的...(碎碎念)
emmm....再次對標題陷入沉思
瞭解對象是什麼類型,有哪些方法的操做
基本類型均可以用type()來判斷,包括變量指向函數或者類。type()
函數返回對應的Class類型。
能用type()
判斷的基本類型也能夠用isinstance()
判斷,而且還能夠判斷一個變量是不是某些類型中的一種。
若是要得到一個對象的全部屬性和方法,可使用dir()
函數,它返回一個包含字符串的list。
祝你們新年快樂~~