小李飛刀:python你在前面飛,欲飲琵琶立刻催

叨叨點啥

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()等函數。

靜態語言vs動態語言

動態語言的「鴨子類型」。
靜態語言不限制傳入的類型,只須要保證傳入的對象有相應的方法便可。
Python的「file-like object「就是一種鴨子類型。
這個還蠻特別的...(碎碎念)

獲取對象信息

emmm....再次對標題陷入沉思
瞭解對象是什麼類型,有哪些方法的操做

  • 使用type()

基本類型均可以用type()來判斷,包括變量指向函數或者類。
type()函數返回對應的Class類型。

  • 使用isinstance()

能用type()判斷的基本類型也能夠用isinstance()判斷,而且還能夠判斷一個變量是不是某些類型中的一種。

  • 使用dir()

若是要得到一個對象的全部屬性和方法,可使用dir()函數,它返回一個包含字符串的list。

祝你們新年快樂~~

相關文章
相關標籤/搜索