【Python】编程笔记6
文章目錄
- 面向?qū)ο缶幊?#xff08;Object Oriented Programming,OOP)
- 一、類(class)和 實例(instance)
- 二、數(shù)據(jù)封裝
- 三、訪問限制
- 四、繼承和多態(tài)
- 五、獲取對象信息
- 1、對象類型——type() 函數(shù)
- 2、isinstance() 函數(shù)
- 3、dir() 函數(shù)
- 4、getattr()、 setattr() 以及 hasattr() 函數(shù)
- 六、實例屬性和類屬性
- 1、實例屬性
- 2、類屬性
面向?qū)ο缶幊?#xff08;Object Oriented Programming,OOP)
三大特性:封裝、繼承和多態(tài)
OOP 把對象作為程序的基本單元,一個對象包含了數(shù)據(jù)和
操作數(shù)據(jù)的函數(shù)(方法)。
一、類(class)和 實例(instance)
類是抽象的模板;實例是根據(jù)類創(chuàng)建出來的一個個具體的“對象”,每個對象都擁有相同的方法,但各自的數(shù)據(jù)可能不同。
class Student(object):# 第一個參數(shù)self表示創(chuàng)建的實例本身,該函數(shù)用于初始化,構(gòu)造函數(shù)def __init__(self, name, score):self.name = nameself.score = scorepassbart = Student('Bart Simpson', 59) print(bart.name) print(bart.score)二、數(shù)據(jù)封裝
可以在類的方法定義時訪問數(shù)據(jù)的函數(shù)。
class Student(object):# 第一個參數(shù)self表示創(chuàng)建的實例本身,該函數(shù)用于初始化,構(gòu)造函數(shù)def __init__(self, name, score):self.name = nameself.score = scoredef print_score(self):print('%s: %s' % (self.name, self.score))def get_grade(self):if self.score >= 90:return 'A'elif self.score >= 60:return 'B'else:return 'C'bart = Student('Bart Simpson', 59) bart.print_score() print(bart.get_grade())輸出結(jié)果
Bart Simpson: 59 C三、訪問限制
為了讓變量只有內(nèi)部可以訪問,外部不能訪問,可以把屬性的名稱前加上兩個下劃線__==》私有變量(private)
==》代碼更加健壯
==》要獲取,則添加新的方法:
四、繼承和多態(tài)
從某個現(xiàn)有的 class 繼承,新的 class 稱為子類( Subclass),而被繼承的 class 稱為基類、父類或超類( Base class、 Super class)。
==》
- 子類獲得了父類的全部功能;
- 對子類修改可以實現(xiàn)子類的特性:修改方法或添加方法
- 在繼承關(guān)系中,如果一個實例的數(shù)據(jù)類型是某個子類,那它的數(shù)據(jù)類型也可以被看做是父類。但是,反過來就不行;
輸出結(jié)果
Dog is running... Cat is running... ---------------------------------------------------- Animal is running... Animal is running... Dog is running... Dog is running... Cat is running... Cat is running... Tortoise is running slowly... Tortoise is running slowly...run_twice() 函數(shù)傳入的任意類型,只要是 Animal 類或者子類,就會自動調(diào)用實際類型的 run()方法。==》多態(tài)
==》“開閉” 原則
- 對擴(kuò)展開放:允許新增 Animal 子類;
- 對修改封閉:不需要修改依賴 Animal 類型的 run_twice()等函數(shù)。
靜態(tài)語言 vs. 動態(tài)語言
- 靜態(tài)語言:run() 方法,若要傳入 Animal 類型,則傳入的對象必須是 Animal 類型或者它的子類,否則無法調(diào)用。
- 動態(tài)語言:run() 方法不一定傳入 Animal 類型,只需保證傳入的對象有一個 run() 方法就可以了。==》“鴨子類型”:不要求嚴(yán)格的繼承體系,一個對象只要有該方法即可。
五、獲取對象信息
1、對象類型——type() 函數(shù)
## 基本類型 print(type(123)) print(type('str')) print(type(None)) ## 變量類型 print(type(abs)) print(type(dog)) ## if 語句中判斷兩個變量的類型 print(type(123) == type(456)) print(type(123) == int) print(type('abc')==type('456'))輸出結(jié)果
<class 'int'> <class 'str'> <class 'NoneType'> <class 'builtin_function_or_method'> <class '__main__.Dog'> True True True判斷一個對象是否是函數(shù)
import types def fn():pass print(type(fn) == types.FunctionType) print(type(fn) == types.BuiltinFunctionType) print(type(lambda x: x) == types.LambdaType) print(type((x for x in range(10))) == types.GeneratorType)輸出結(jié)果
True False True True2、isinstance() 函數(shù)
isinstance() 函數(shù):判斷一個對象是否是該類型本身,或者位于該類型的父繼承鏈上
若繼承關(guān)系為:object -> Animal -> Dog -> Husky。
a = Animal() d = Dog() h = Husky() isinstance(h, Husky) # True isinstance(h, Dog) # True isinstance(h, Animal) # True isinstance(d, Dog) and isinstance(d, Animal) # True isinstance(d, Husky) # False能用 type()判斷的基本類型也可以用 isinstance()判斷;
isinstance('a', str) # True判斷一個變量是否是某些類型中的一種;
isinstance([1, 2, 3], (list, tuple)) # True3、dir() 函數(shù)
dir()函數(shù):獲取一個對象的所有屬性和方法,返回一個包含字符串的 list。
print(dir('ABC'))輸出結(jié)果
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']==》其中,類型__xxx__的屬性和方法是有特殊用途的,其余的為普通屬性或方法。
4、getattr()、 setattr() 以及 hasattr() 函數(shù)
場景:只有在不知道對象信息的時候,我們才會去獲取對象信息。
getattr()、 setattr() 以及 hasattr() ==》直接操作一個對象的狀態(tài)。
輸出結(jié)果
True 9 False None True 19 19 404 True <bound method MyObject.power of <__main__.MyObject object at 0x00000201083E2080>> 81常見做法:假設(shè)我們希望從文件流 fp 中讀取圖像,我們首先要判斷該 fp 對象是否存在 read 方法,如果存在,則該對象是一個流,如果不存在,則無法讀取。 hasattr()就派上了用場。
def readImage(fp):if hasattr(fp, 'read'):return readImage(fp)return None六、實例屬性和類屬性
1、實例屬性
Python 中可根據(jù)類創(chuàng)建的實例可以任意綁定屬性,綁定方法:通過實例變量,或者通過 self 變量。
class Student(object):def __init__(self, name):self.name = name s = Student('Bob') s.score = 90 print(s.name) # Bob print(s.score) # 902、類屬性
直接在 class 中定義屬性 ==》類屬性
實例屬性優(yōu)先級比類屬性高,因此,調(diào)用實例屬性時,若實例屬性存在,會產(chǎn)生屏蔽類屬性的現(xiàn)象
- 調(diào)用方法:實例.屬性
- 調(diào)用方法:類.屬性
輸出結(jié)果
Student Student Michael Student Student 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的【Python】编程笔记6的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】编程笔记5
- 下一篇: 【Python】编程笔记7