python學習---面向對象的編程續一(五)

題外話:關於縮進

    python關於縮進,對於新手,或者學過其餘語言,而後再學習python對於格式可能有些不習慣。同時也沒有{},剛開始我也爲這種格式蛋疼了一會,因爲縮進有問題,連編譯都編譯不了。可是若是你選擇了一款正確的編輯器,而後再嚴格按照這種風格去編碼,你會發現你的python代碼是如此的漂亮。在這裏我推薦pycharm ,關於註冊什麼的,本身能夠在網上搜搜註冊碼,這是一款我認爲比較好用的編輯器。但願你也能喜歡。java

注:前面四部分,都是我參看《python簡明教程》 很容易理解,因此就將其中的一些比較重要的概念羅列了出來,接下來的小節,將會加入本身的理解,而且逐步深刻,請各位網友多加指點python

python的面向對象深刻

#-*- coding:utf-8 -*-

__author__ = 'oldcaptain.cc'

class SchoolMember:

'''表明任何學校成員'''

def __init__(self,name,age):

self.name = name

self.age = age

print '初始化的成員: %s' % self.name

def tell(self):

'''說話細節'''

print '名稱:"%s" age : "%s"'%(self.name,self.age)

class Teacher(SchoolMember):

'''表明一個老師'''

def __init__(self,name,age,salary):

SchoolMember.__init__(self,name,age)

self.salary = salary

print '初始化的老師有 : %s' %self.name

def tell(self):

SchoolMember.tell(self)

print '科目 : "%d" ' % self.salary

class Student(SchoolMember):

def __init__(self,name,age,marks):

SchoolMember.__init__(self,name,age)

self.marks = marks

print '初始化的學生爲 : %s' %self.name

def tell(self):

SchoolMember.tell(self)

print 'marks : "%d"' %self.marks

t = Teacher("oldcaptain",40,30000)

s = Student("guopeng",22,75)

上面這段代碼是一段關於繼承的實現,表現出了多態,而且展示出了一些關於python面向對象的一些語法知識。c++

一、pass關鍵字

當這個類中沒有沒有定義任何關鍵字或者方法的時候,可使用關鍵字pass,至關於java中的{}什麼也沒有,一個空的類。sql

二、縮進

在類中的全部東西都縮進,if,函數,for,等等,當不縮進的代碼則被認爲不屬於這個類。編輯器

三、繼承

在python中,類的基類只是簡單的列在類名後面的小括號中,若是你想要多重繼承,那麼就在類名後面的小括號中列出你要繼承的類名,而且以逗號進行分割。在java中,父類的方法在子類方法執行前被自動調用,python不是這樣,你必須顯示的調用父類中的合適方法。函數

四、再說__init__方法

__init__在類的實例被建立後被當即調用。他可能會讓你誤解爲構造函數。由於他看上去像(在類中,習慣被第一個定義的方法)行爲也像(在一個新建立的實例中,它是第一個被調用的方法),說它不正確時由於對象再調用init方法時,已經被構造出來了,你已經有了 一個對類的的新實例的有效引用。可是__init__是在python中你能夠獲得最接近構造函數的東西。而且他也扮演者很是類似的角色。學習

五、參數

每一個類的方法的第一個參數,包括__init__,都是指向類當前的實例的引用。按照習慣這個參數老是被稱爲self。在__init__方法中,self指向新建立的對象;在其餘的類方法中,它指向方法被調用的類實例。儘管當定義方法時你須要明確指定self,但在調用方法時,你不能指定他,python會給你自動加上的。測試

__init__方法能夠接受任意數目的參數,就像函數同樣,參數能夠用缺省值定義,便可以設置成對於調用者可選。this

六、self

self至關於c++或者java中的this,可是他並非一個保留字,它只是一個命名習慣。因此請必定堅持這個習慣。google

七、什麼時候使用self和__init__

當你定義本身的類方法時,你必須明確的將self做爲每一個方法的第一個參數列出,包括__init__ ,當你從類中調用一個父類的方法時,你必須包括self參數,但當你從類的外部調用你的類方法時,你沒必要對self參數指定任何值;你徹底將其忽略,而python會自動替你增長實例的引用。剛開始這裏可能不是很好理解。因此須要慢慢在代碼中理解這些特性。

注:__init__方法是可選的,可是一旦定義了以後,就必需要顯示調用父類的__init__方法(若是它定義了的話)這樣纔是正確的:不管什麼時候子類想要擴展父類的行爲,後代方法必須在適當的時機,使用適當的參數,顯示調用父類方法。

八、類的實例

每個類的實例有一個內置屬性,_class_,它是對象的類。(注意這個表示,在內存中的地址,通過我本身測試,這裏並非物理地址。)

在python中,每個對象都有本身的元數據屬性,包括__class__,__dict__,__module__等.

九、參數的重載

在java中支持經過參數列表的重載,也就是一個類能夠同名的方法,但這些方法或者是參數個數不一樣,或者參數的類型不一樣,像plsql支持參數名的重載。在python中兩種都不支持,總之沒有任何形式的函數重載。一個__init__方法就是一個__init__方法,無論什麼樣的參數,一個類中只能有一個__init__方法,而且若是一個子類擁有一個__init__方法,他老是覆蓋父類的__init__方法,甚至子類能夠用不一樣的參數列表來定義它。

python做者解釋 :方法的覆蓋 : 子類能夠覆蓋父類中的方法。由於方法沒有特殊的優先的設置,父類中的一個方法在調用同類中的另外一個方法時,可能調用到的是子類中覆蓋的覆蓋的父類的同名方法的方法。

相關文章
相關標籤/搜索