Python面向对象编程之类的概念
1、面向对象基本概念
1.1 万物皆对象
Python
语言的中所有数据类型都是对象、函数是对象、模块是对象Python
所有类都是继承最基础的类object
Python
语言中的数据类型的操作功能都是类方法的体现
1.2 面向对象编程
面向对象编程又叫OOP
(Object-Oriented-Programming)
OOP
:面向对象编程,一种编程思想,重点在于高抽象的复用代码OOP
把对象当做程序的基本单元,对象包含数据和操作数据的函数OOP
本质是把问题解决抽象为以对象为中心的计算机程序OOP
在较大规模或复杂项目中十分有用,OOP可以提高协作产量OOP
最主要的价值在于代码复用OOP
仅仅是一个编程方式,并非解决问题的高级方法
面向过程与面向对象的区别
面向过程以解决问题的过程步骤为核心编写程序的方式,面向对象以问题对象构建和应用为核心编写程序的方式,所有能用OOP
解决的问题,面向过程都能解决。
1.3 面向对象的特征
封装(Encapsulation) :属性和方法的抽象,用数据和操作数据的方法来形成对象逻辑
方法的抽象:对类的属性(变量)进行定义、隔离和保护
- 对象的抽象:对类的方法(函数)进行定义、隔离和保护
- 目标是形成一个类对外可操作属性和方法的接口
继承:代码复用的高级抽象,用对象之间的继承关系来形成代码复用
继承是面向对象程序设计的精髓之一
- 实现了以类为单位的高抽象级别的代码复用
- 继承是新定义类能够几乎完全使用原有类属性与方法的过程
多态:方法灵活性的抽象,让对象的操作更加灵活、更多复用代码
参数类型的多态:一个方法能够处理多个类型的能力
- 参数形式的多态:一个方法能够接受多个参数的能力
- 多态是
OOP
的一个传统概念,Python
天然支持多态,不需要特殊语法
2、Python面向对象的术语
类(Class
)和对象(Object
)
- 类:逻辑抽象和产生对象的模板,一组变量和函数的特定编排
- 对象:具体表达数据及操作的实体,相当于程序中的“变量”。包括:类对象、实例对象
类定义完成后,默认生成一个类对象,每个类唯一对应一个类对象,用于存储这个累的基本信息 类对象是type的实例,表达为type
类型;
- 实例对象(
Instance Object
):Python
类实例后产生的对象,简称:对象 - 类对象全局只有一个,实例对象可以生成多个
属性:存储数据的“变量”(就是定义在类中的变量),用来描述类的一些特性参数。包括:类属性、实例属性
- 类属性(
Class Attribute
):类对象的属性,由所有实例对象共享;类内定义,在__init__函数外面。一般是类所共有的属性定义为类属性。 - 实例属性(
Instance Attribute
):实例对象的属性,一般在类中的函数中定义,实例属性可能为某个实例独有。
方法:操作数据的“方法”(就是定义在类中的变量),用来给出类的操作功能。包括:类方法、实例方法、自由方法、静态方法、保留方法
- 类方法(
Class Method
):类对象的方法,由所有实例对象共享 - 实例方法(
Instance Method
):实例对象的方法,由各实例对象独享,最常用的形式、 - 自由方法(
Namespace Method
):类中的一个普通函数,由类所在命名空间管理,类对象独享 - 静态方法(
Static Method
):类中的一个普通函数,由对象和实例对象共享 - 保留方法(
Reserved Method
):有双下划线喀什和结束的方法,保留使用。
实例化:从类到对象的过程,所有“对象”都源于某个“类”
3、Python类的构建
3.1 类的基本构建
在Python
中,使用class
关键字加上类名来定义类,通过缩进我们可以确定类的代码块,就如同定义函数那样。语法结构
class <类名>: [类描述“documentation string”] <语句块>
因为
Python
是脚本语言,定义类不限制位置,可以包含在分支或其他从属语句块中,执行是存在即可
- 类名:可以是任何有效的标识符,一般首字母大写
- 类描述:在类定义后首行,以独立的字符串形式定义;定义后通过
<类名>.__doc__
来访问
示例代码
class TestClass: """这是一个测试的类""" print("Hello Class Object") print(TestClass.__doc__) print(type(TestClass)) ''' ----输出结果---- Hello Class Object 这是一个测试的类 <class 'type'> '''
类对象直接包含的语句会被执行,所有,定义类尽量不在类中直接包含语句
实例对象:实例对象是Python
类最常用的方式
创建实例对象语法结构
<对象名> = <类名>([参数])
实例代码:
class TestClass: print("一碗周") tt = TestClass() print(type(tt)) ''' ----输出结果---- 一碗周 <class '__main__.TestClass'> '''
3.2 类的构造函数
概念:
- 类的构造函数用于从类创建实例对象的过程
- 类的构造函数为实例对象创建提供了参数输入方式
- 类的构造函数为实例属性的定义和赋值提供了支持
Python中使用预定义的__init__()作为构造函数
语法结构:
class ClassName: def __init__(self,[参数1], [参数2], ...[参数n]): <语句块> ...
实例代码:
class TestClass: def __init__(self, name): print(name) text1 = TestClass("张三") # 张三 text2 = TestClass("李四") # 李四
通过构造函数__init__
可以为Python
提供参数
**__init__()**
的使用说明
参数:第一个参数约定是self,表示类实例自身,其他参数是实例参数(self
是内部使用的,默认保留,其他用户输入的参数放到self后面)
函数名:Python
解释器内部定义,由双下划线 (__)
开始和结束
返回值:构造函数没有返回值,或返回为None
,否则产生TypeError
异常
**self
**在类定义内部代表类的实例
slef
是Python
面向对象中约定的一个类参数self
代表类的实例,在类内部,self
用于组合访问实例相关的属性和方法- 相比,类名代表类对象本身
3.3 类的属性
属性是类内部定义的变量,语法结构如下:
class ClassName: <类属性名> = <类属性初值> def __init__(self,[参数1], [参数2], ...[参数n]): self.<实例属性名> = <实例属性初值> ...
- 访问类属性:<类名>.<类属性>或者<对象名>.<类属性>
- 访问实例属性:<对象名>.<实例属性>
实例代码
class TestClass: count = 0 # 类属性 def __init__(self, name, age): self.name = name # 实例属性 self.age = name TestClass.count += 1 # 实例化一次 count+1 students1 = TestClass("张三", "18") students2 = TestClass("李四", "19") print("总数:", TestClass.count) # 总数: 2 print(students1.name, students2.name) # 张三 李四
3.4 类的方法
(1)实例方法:实例方法是类内部定义的函数,与实例对象无关,语法结构
class ClassName: def <方法名>(self, <参数列表>): ...
<方法名>(<参数列表>)的方式使用实例方法的定义第一个参数是self
实例代码
class TestClass: def __init__(self, number): self.number = number def sum_number(self): # 实例方法 sum_num = 0 for i in range(self.number + 1): # 因为循环不会到最后一个数字 sum_num += i return sum_num number1 = TestClass(100) number2 = TestClass(10) print(number1.sum_number()) # 5050 print(number2.sum_number()) # 55
(2)类方法:类方法是与类对象相关的函数,有所有实例对象共享,语法结构↓
class ClassName: @classmethod def <方法名>(cls, <参数列表>): ...
<方法名>(<参数列表>)或者<类名>.<方法名>(<参数列表>)的方式使用,类方法至少包含一个参数,表示类对象,建议用@classmethod
是装饰器,类方法定义所必须
类方法只能操作类属性和其他类方法,不能操作实例属性和实例方法。
实例代码
class TestClass: sum_num = 0 def __init__(self, number): self.number = number def sum_number(self): for i in range(self.number + 1): # 因为循环不会到最后一个数字 TestClass.sum_num += i return TestClass.sum_num @classmethod def test(cls): # 类方法 test_value = TestClass.sum_num * 2 return test_value value1 = TestClass(100) print(value1.sum_number()) # 5050 print(value1.test()) # 10100
(3)自有方法:自有方法是定义在类名空间中的普通函数,语法格式如下:
class ClassName: def <方法名>(<参数列表>): ...
.<方法名>(<参数列表>)
的方式使用,<类名>表示命名空间。自有方法不需要self
或cls
这类参数,可以没有参数。自有方法只能操作类属性和类方法,不能操作实例属性和实例方法。自由方法的使用只能使用<类名>
严格的说自由方法不是一个方法,只是一个定义在类中的函数
实例代码
class TestClass: sum_num = 0 def __init__(self, number): self.number = number def sum_number(self): for i in range(self.number + 1): # 因为循环不会到最后一个数字 TestClass.sum_num += i return TestClass.sum_num def test(): # 自由方法 test_value = TestClass.sum_num * 2 return test_value def test_out(): # 等于上面的那个自由方法 test_out_value = TestClass.sum_num * 2 return test_out_value value = TestClass(100) print(value.sum_number()) # 5050 print(TestClass.test()) # 10100 print(test_out()) # 10100
定义来类中的自由方法也可以定义到外面
(4)静态方法:定义在类中的普通函数,能够被所有实例对象共享
class ClassName: @staticmethod def <方法名>(<参数列表>): ...
.<方法名>(<参数列表>)或者<类名>.<方法名>(<参数列表>)
的方式使用静态方法也可以没有参数,可以理解为可以使用对象名调用的自有方法。 @staticmethod
是装饰器,静态方法定义所必需的,静态方法同自由方法一样,只能操作类属性和类方法,不能操作实例属性和实例方法,不同的是可以通过<类名>或<对象名>。
示例代码
class TestClass: sum_num = 0 def __init__(self, number): self.number = number def sum_number(self): for i in range(self.number + 1): # 因为循环不会到最后一个数字 TestClass.sum_num += i return TestClass.sum_num @staticmethod # 静态方法装饰器 def test(): test_value = TestClass.sum_num * 2 return test_value value = TestClass(100) print(value.sum_number()) # 5050 print(TestClass.test()) # 10100 print(value.test()) # 10100
(5)保留方法:有双下划线喀什和结束的方法,保留使用。语法结构↓
class ClassName: def <保留方法名>(<参数列表>): ...
保留方法一般都对应类的某种操作,在使用操作符的时候调用是Python
解释器中保留的方法
到此这篇关于Python面向对象编程之类的概念的文章就介绍到这了,更多相关Python面向对象编程之类的概念内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
原文出处:https://juejin.cn/post/7023376907966103560
相关文章
- 以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
- 操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
- 无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
- 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把...2015-10-23
- 这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧...2020-06-25
- 1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。示例: for (var i = 1; i <= 3; i++) {setTimeout(functi...2015-10-23
- ecshop商品无限级分类代码 function cat_options($spec_cat_id, $arr) { static $cat_options = array(); if (isset($cat_options[$spec_cat_id]))...2016-11-25
- 这篇文章主要介绍了mybatis-plus实体类主键策略有3种(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-27
- 这篇文章主要介绍了C#类中static变量用法,实例分析了static变量使用技巧与相关注意事项,需要的朋友可以参考下...2020-06-25
- 在php中要实现分页比起asp中要简单很多了,我们核心就是直接获取当前页面然后判断每页多少再到数据库中利用limit就可以实现分页查询了,下面我来详细介绍分页类实现程序...2016-11-25
- System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。在必须更新用户界面的情况下,建议不要使用该计时器,因为它的回调不在用户界面线程上发生...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记整理_浅谈Math类的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
- 本篇文章主要介绍了C#异步编程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。...2020-06-25
- 这篇文章主要给大家介绍了ES5和ES6中类的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-21
- 这篇文章主要给大家介绍了关于Java匿名内部类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-31
- 一、数据库设计 -- -- Table structure for table `category` -- CREATE TABLE `category` ( `id` int(11) NOT NULL auto_increment, `catpath` varchar(255) default NULL, `name` varchar(255) default NULL...2015-11-08
- 本文实例讲述了PHP多文件上传类,分享给大家供大家参考。具体如下:<?phpclass Test_Upload{ protected $_uploaded = array(); protected $_destination; protected $_max = 1024000; protected $_messages =...2015-10-30