1、面向對象的概念
擁有共同屬性的一類進行歸類的過程叫做面向對象。
2、注意事項
class定義類的時候,類名的首字母必須大寫
3、面向對象案例
1 class Person(object):
2 def __init__(self,name,age): #name,age可以理解為類的屬性;init為初始化;類裡定義的函數稱為構造方法/構造函數
3 self.name=name #實例屬性
4 self.age=age
5 print("start")
6 def __del__(self): #清理操作
7 print("end")
8 def show(self): #self為類本身,不可省略
9 print("name:{0},age:{1}".format(self.name,self.age))
10 obj=Person(name="wuya",age=18) #要調用類裡邊的變量、方法函數等,首先需要對類進行實例化;obj是類Person()實例化後的對象,類實例化的過程也是類初始化的過程。類的實例化過程也是針對構造方法初始化的過程(等於調用了__init__的方法)
11 obj.show()
12 #Person(name="wuya",age=18).show() #用類名調用方法
以上代碼運行的結果為:
4、類中方法的執行順序:初始化方法->具體的方法->清理的方法
5、面向對象的特性
1)封裝
a.實例屬性
b.數據屬性(類中的變量)
2)繼承
3)多態
6、方法:
a.普通方法:屬於對象,也屬於類,只能讀寫;
b.特性方法:屬於對象,只具備讀屬性,方法不能有形式參數;
c.靜態方法:屬於類,只能用類名來調用,一般把數據屬性使用靜態方法來處理
7、封裝入門實例
1 class Animal(object):
2 def __init__(self,age):
3 self.age=age
4 def getAge(self):
5 return self.age
6 def setAge(self,age):
7 if age>10 and age<100:
8 self.age=age #允許修改年齡
9 else:
10 print("年齡錯誤")
11 objAnimal=Animal(age=25) #類的實例化
12 print(objAnimal.getAge()) #輸出獲取年齡的方法的調用結果
13 objAnimal.setAge(age=11) #調用修改年齡的方法
14 print(objAnimal.getAge()) #輸出獲取年齡的方法的調用結果
8、封裝的進階實例
1 class Animal(object):
2 address="地球" #數據屬性
3 def __init__(self,age):
4 self.age=age #實例屬性
5 # @staticmethod
6 def address(self): #靜態方法,數據屬性使用靜態方法來處理
7 return "地球"
8 def show(self,name="*"): #普通方法,可讀寫
9 print("it come from {0},and it's age is {1},and it's name is {2}".format(self.address(),self.age,name))
10 def func(self,**kwargs):
11 print(kwargs)
12 @property
13 def info(self): #特性方法,只讀(只有輸出)
14 print("hello world")
15 @property
16 def getAge(self): #特性方法,只讀(只有返回)
17 return self.age
18 objAnimal=Animal(age=30) #類的實例化
19 objAnimal.show() #調用普通方法
20 #objAnimal.show(name="monkey")
21 # Animal().show(name="monkey")
22 # Animal(age=10).address()
23 objAnimal.func(name="cch",age=18,city="西安")
24 objAnimal.info #特性方法調用
25 print(Animal.address(""))
26 print(objAnimal.age)
9、繼承
1)概念
父類(基類):被繼承的類
子類(派生類):繼承其他的類
2)Java和Python繼承的區別
Java是單繼承的,Python是多繼承的
3)子類繼承父類的什麼:
a、變量(數據屬性)
b、實例屬性
c、方法
3)方法重寫
當父類的方法沒有辦法滿足子類的需求的時候,子類就會重寫父類的方法,那麼子類實例化後的對象調用該方法,優先考慮的是子類的方法。
1 class Father(object):
2 address="西安"
3 def __init__(self,name,age):
4 self.name=name
5 self.age=age
6 def info(self):
7 print("this is a father's method")
8 class Son(Father):
9 def __init__(self,name,age,score):
10 Father.__init__(self,name,age) #子類繼承了父類的實例屬性
11 self.score=score
12 def show(self):
13 print("name is {0},and age is {1},and score is {1}".format(self.name,self.age,self.score))
14 def info(self): #父類的方法重寫
15 print("this is a son's method")
16 son=Son(name="wuya",age=18,score=99)
17 son.show()
18 print(son.address) #子類繼承了父類的變量(數據屬性)
19 son.info() #不用print,info()中有print,函數與返回值時,輸出函數為空。子類重寫父類的方法,那麼子類實例化後的對象調用該方法,優先考慮的是子類的方法。
以上代碼運行的結果為:
10、繼承順序
1)從上到下(前提條件):
a.單個繼承
b.子類重寫了父類的方法
2)從左到右(前提條件):子類繼承多個類(子類可以繼承多個父類,但父類之間必須是同級關系。)
3)所以在Python中,基於MRO的解析順序規則,就會從左到右開始查找基類,如果找到第⼀個匹配的屬性類,就會停⽌查找,如果沒有,那就繼續查找,直到查找到符合要
求的為止。MRO其實就是通過⼀個C3線性化算法來實現的,它的核心思想為:
子類會優於父類檢查
多個父類會根據他們在列表中的順序被依次檢查
如果對下一個類存在兩個合法的選擇,只能選擇第一個(線性查找)
11、繼承順序示例
1 class Father(object):
2 def __init__(self,name,age):
3 self.name=name
4 self.age=age
5 def funM(self):
6 print("father")
7
8 class Mother(object):
9 def funM(self):
10 print("mother")
11
12 class Son(Father,Mother): #子類Son繼承了兩個父類
13 def __init__(self,name,age,score):
14 Father.__init__(self,name,age) #子類Son繼承了父類Father和Mother的實例屬性
15 self.score=score
16
17 son=Son(name="ccj",age=18,score=100)
18 son.funM()
19 print(Son.mro()) #使用類名調用mro,查看類的執行順序
以上代碼的執行結果為:
12、子類繼承多個非同級的父類錯誤示例
1 class Person(object):
2 pass
3
4 class Father(Person):
5 def __init__(self):
6 pass
7 def funM(self):
8 print("father")
9 class Mother(object):
10 def funM(self):
11 print("mother")
12
13 class Son(Person,Father): #子類繼承的多個父類不是同一級,代碼會報錯,z子類可以繼承多個父類,但父類之間必須是同級關系。
14 def __init__(self,score): 15 Father.__init__(self) 16 self.score=score 17 son=Son(score=90) 18 son.funM() 19 print(Son.mro())
以上代碼的運行結果為;
13、繼承方法調用錯誤示例
1 class Person(object):
2 pass
3
4 class Father(Person):
5 def __init__(self):
6 pass
7
8 class Mother(Person):
9 def funM(self):
10 print("mother")
11
12 class Son(Father): #子類繼承的父類中沒有funM方法,代碼會報錯
13 def __init__(self,score):
14 Father.__init__(self)
15 self.score=score
16
17 son=Son(score=99)
18 son.funM()
以上代碼的運行結果為:
14、繼承方法調用錯誤示例糾正
1 class Person(object):
2 def funM(self):
3 print("person")
4
5 class Father(Person):
6 def __init__(self):
7 pass
8
9 class Mother(Person):
10 def funM(self):
11 print("mother")
12
13 class Son(Father): #子類繼承法的父類是Father
14 def __init__(self,score):
15 Father.__init__(self)
16 self.score=score
17
18 son=Son(score=99)
19 son.funM() #子類調用方法,先從子類中查找,再從繼承的父類查找,若未找到,再從父類的父類中查找。
20 print(Son.mro())
以上方法的運行結果為:
15、繼承歷史問題
python2是深度優先,python3是廣度優先
1 class A:
2 def show(self):
3 print('A')
4
5 class B(A):
6 pass
7
8 class C(A):
9 def show(self):
10 print('C')
11
12 class D(B,C):
13 pass
14
15 if __name__ == '__main__':
16 obj=D()
17 obj.show() #python2執行的結果是A,pyhton3中的運行結果為C
16、多態
多太的優勢具體可以總結為如下幾點,具體為:
增加了持續的靈活性
增加了持續的額外擴展功能
1 class Animal(object):
2 def talk(self):
3 print("動物會叫")
4
5 class Dog(object):
6 def talk(self):
7 print("狗也會叫")
8
9 class Cat(object):
10 def talk(self):
11 print("貓也會叫")
12
13 def func(animal):
14 animal.talk()
15 if __name__ == '__main__':
16 dog=Dog()
17 func(animal=dog)
以上代碼的運行結果為:
Python基礎知識 一.初識基本數據類型 類型: int(整型) 在32位機器上,整數的位數為32位,取值范圍為-2**31-2**31-1,即-2147483648-2147483647 在64位 ...
python 基礎知識(一) 一.python發展介紹 Python的創始人為Guido van Rossum.1989年聖誕節期間,在阿姆斯特丹,Guido為了打發聖誕節的無趣,決心開發一個新的腳本 ...
接觸python已有一段時間了,下面針對python基礎知識的使用做一完整梳理:1)避免‘\n’等特殊字符的兩種方式: a)利用轉義字符‘\’ b)利用原始字符‘r’ print r'c:\now' ...
Python基礎知識(Basic knowledge) 1.認識Python&基礎環境搭建 2.Python基礎(上) 3.Python基礎(中) 4.Python基礎(下) 5.Python ...
參考鏈接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base python基礎知識筆 ...
以下內容,作為python基礎知識的補充,主要涉及基礎數據類型的創建及特性,以及新數據類型Bytes類型的引入介紹
python基礎知識講解——@classmethod和@staticmethod的作用 在類的成員函數中,可以添加@classmethod和@staticmethod修飾符,這兩者有一定的差異,簡單來 ...
本次python爬蟲百步百科,裡面詳細分析了爬蟲的步驟,對每一步代碼都有詳細的注釋說明,可通過本案例掌握python爬蟲的特點: 1.爬蟲調度入口(crawler_main.py) # coding: ...
摘要:偶然機會接觸到python語音,感覺語法簡單.功能強大,剛好朋友分享了一個網課<python 爬蟲與數據可視化>,於是在工作與閒暇時間學習起來,並做如下課程筆記整理,整體大概分為4個 ...
# -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春藥# @Email : [email protected]# @Fi ...
var store = Ext.create('Ext.data.Store', { storeId:'employeeStore', fields:['name', 'seniority', 'de ...
有序集合似乎更大的操作是由於加了一個叫做“分子”的東西 事實上就好像普通的數據,只是為這個數據加了一個純數字的標識, 通過操作這些標識來得到我們想要的數據! 分子可以是整形,也可以是雙精度浮點型: = ...
題意:給出n個字符串,按照字典序排列,再按照規則輸出. ===學習的紫書,題目意思很清楚,求列數和行數最開始看的時候木有看懂啊啊啊 列數:即為(60-M)/(M+2)+1;即為先將最後那一列減去,算普 ...
cd命令技巧 直接進入用戶的home目錄: cd ~ 進入上一個目錄: cd - 進入當前目錄的上一層目錄: cd .. 進入當前目錄的上兩層目錄: cd ../.. 其他常用方法 利用tab鍵,自動 ...
數據范圍:$n≤5000$,$a,l,r≤10^9$,$b,w,p≤2\times 10^5$. 我們考慮一種暴力的最小割做法: 首先令$sum=\sum\limits_{i=1}^{n} b_i+w ...
[From] https://blog.yoodb.com/yoodb/article/detail/157 使用HBase Java Client連接HBase服務端創建Configuration對 ...
洛谷P2831 憤怒的小鳥 原題鏈接 題解 首先簡單數學公式送上. \(ax_1^2+bx_1=y_1\) \(ax_2^2+bx_2=y_2\) \(ax_1^2x_2+bx_1x_2=y_1x_2 ...
;指定xdebug文件 zend_extension = "F:\tools\develop_tools\php\php_xdebug-2.2.2-5.4-vc9.dll" ;xd ...
用戶組:人民優步“關羽組”(適用於11月16日-11月22日)獎勵政策: 滴快車單單2.5倍,注冊地址:http://www.udache.com/ 如何注冊Uber司機(全國版最新最詳細注冊流程)/ ...
.NET C#生成隨機顏色,可以控制亮度,生成暗色或者亮色 基於YUV模式判斷顏色明亮度 隨機顏色在日常開發中很常用到,有時候要控制顏色明亮度,比如在白色背景網頁上的隨機顏色,一般要求顏色稍微暗一 ...