python学习之【第十七篇】:Python中的面向对象(类和对象)
1.什么是类和类的对象?
类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起,类是现实世界的抽象的实体以编程形式出现。实例是这些对象的具体化。类是用来描述一类事物,类的对象指的是这一类事物的一个个体。例如:“人”就是一个类,而男人,女人,小孩等就是“人”这个类的实例对象;再比如“动物”也是一个类,而猫,狗等就是“动物”这个类的实例对象。
1.1 类的构成
在Python中,类(class)由3个部分构成:
- 类的名称:类名;
- 类的属性:一组数据;
- 类的方法:进行操作的方法;
1.2 类的声明和定义
在Python中,类声明和函数声明很相似,头一行用class
关键字,接下来是一个作为它的定义的代码体,如下所示:
class 类名(object):
'类的说明解释文档'
类体
注:通常,类名命名规则采用大驼峰式命名。
1.3 类的对象
在Python中,可以根据已经定义好的类去创建出一个个对象,创建对象也叫做实例化对象,对象是由类实例化而来的,类实例化的结果称为一个实例或者称为一个对象。
实例化对象的语法是:
对象名 = 类名()
例如:现有一个“车”类,而BMW是“车”类的一个对象,实例化这个对象即就是:
BMW = Car()
2._init_() 构造函数
__init__()
方法是类的构造器,在实例化对象时,主要完成对对象的一些初始设定。当类被调用时,实例化的第一步就是创建实例对象,一旦对象创建了,Python就会检查在类里面是否实现了__init__()
方法,如果没有定义__init__()
方法,则实例化对象时会创建出一个没有任何属性的空对象。
__init__()
方法主要有以下特点:
__init__()
方法,在实例化对象时会被自动调用,不需要手动调用;__init__()
方法中,第1个参数必须为self
,如果在实例化对象时传递了2个实参,那么__init__()
方法中除了self
作为第一个形参外还需要2个形参,即__init__(self,x,y)
;- 在调用类实例化对象时,
__init__()
方法中的self
参数,不需要开发者传递,Python解释器会自动把当前的对象引用传递进去;
示例:
class Car(object):
"""这是一个Car类"""
# 数据属性
def __init__(self, wheel, color):
self.wheel = wheel
self.color = color
def get_car_info(self):
print('车轮子个数%s,车的颜色%s' % (self.wheel, self.color))
# 函数属性
def move(self):
print('车正在移动。。。')
BMW = Car(4, '红色')
BMW.move()
BMW.get_car_info()
print(BMW.wheel)
print(BMW.color)
"""
输出:
车正在移动。。。
车轮子个数4,车的颜色红色
4
红色
"""
3.类属性
定义在类里面的属性叫做类属性,类属性可以在各个实例之间共享,包括父类的类属性也可以在子类的实例中共享,类可以访问类属性,但不能访问实例属性。类属性分为:数据属性和函数属性。
class Car(object):
# 数据属性
wheel_num = 4
# 函数属性
def move(self):
print('车正在移动。。。')
3.1 类属性的增
向类里面增加新的类属性。
语法:
类名.新类属性名 = 新类属性值
示例:
class Car(object):
# 数据属性
wheel_num = 4
# 函数属性
def move(self):
print('车正在移动。。。')
print('增加之前', Car.__dict__)
Car.color = 'black'
print(Car.color) # 输出 black
print('增加之后', Car.__dict__)
"""
输出:
增加之前 {'__module__': '__main__', 'wheel_num': 4, 'move': <function Car.move at 0x00000000027C9950>, '__dict__': <attribute '__dict__' of 'Car' objects>, '__weakref__': <attribute '__weakref__' of 'Car' objects>, '__doc__': None}
black
增加之后 {'__module__': '__main__', 'wheel_num': 4, 'move': <function Car.move at 0x00000000027C9950>, '__dict__': <attribute '__dict__' of 'Car' objects>, '__weakref__': <attribute '__weakref__' of 'Car' objects>, '__doc__': None, 'color': 'black'}
"""
3.2 类属性的删
删除类里面的某一个类属性。
语法:
del 类名.类属性
示例:
class Car(object):
# 数据属性
wheel_num = 4
# 函数属性
def move(self):
print('车正在移动。。。')
print('删除之前', Car.__dict__)
del Car.wheel_num
print('删除之后', Car.__dict__)
"""
输出:
删除之前 {'__module__': '__main__', 'wheel_num': 4, 'move': <function Car.move at 0x0000000002799950>, '__dict__': <attribute '__dict__' of 'Car' objects>, '__weakref__': <attribute '__weakref__' of 'Car' objects>, '__doc__': None}
删除之后 {'__module__': '__main__', 'move': <function Car.move at 0x0000000002799950>, '__dict__': <attribute '__dict__' of 'Car' objects>, '__weakref__': <attribute '__weakref__' of 'Car' objects>, '__doc__': None}
"""
3.3 类属性的改
修改类里面的某个类属性。
语法:
类对象.类属性 = 新值
示例:
class Car(object):
# 数据属性
wheel_num = 4
# 函数属性
def move(self):
print('车正在移动。。。')
print('修改之前', Car.wheel_num) # 输出 修改之前 4
Car.wheel_num = 5
print('修改之后', Car.wheel_num) # 输出 修改之后 5
注意:
如果修改类属性,必须通过 类对象.类属性 = 新值 去修改,不能通过实例访问类属性修改,如果使用实例访问类属性修改类属性,只会在实例中新建一个与类属性同名的实例属性,并且当实例属性与类属性同名时,实例只会访问到实例属性,而不会去访问类属性。
3.4 类属性的查
访问类属性直接使用类名.类属性即可访问。
如果需要查看某个类中都有哪些类属性时,可以使用内置属性_dict_进行查看,该内置属性返回一个字典,包含了类中所有的属性。
示例:
class Car(object):
# 数据属性
wheel_num = 4
# 函数属性
def move(self):
print('车正在移动。。。')
print(Car.__dict__)
"""
输出:
{'__module__': '__main__',
'wheel_num': 4,
'move': <function Car.move at 0x00000000027F9950>,
'__dict__': <attribute '__dict__' of 'Car' objects>,
'__weakref__': <attribute '__weakref__' of 'Car' objects>,
'__doc__': None}
"""
3.5 类的几个特殊属性
类里面除了有自定义的属性外,还有几个特殊的内置属性。
- _name_:返回类的名字
- _doc_:返回类的文档字符串
- _base_:返回类的第一个父类
- _bases_:返回类的所有父类构成的元组
- _module_:返回类定义所在的模块
- _class_:返回实例对应的类
示例:
class Car(object):
"""这是一个Car类"""
# 数据属性
wheel_num = 4
# 函数属性
def move(self):
print('车正在移动。。。')
print(Car.__name__) # 输出 Car
print(Car.__doc__) # 输出 这是一个Car类
print(Car.__base__) # 输出 <class 'object'>
print(Car.__bases__) # 输出 (<class 'object'>,)
print(Car.__module__) # 输出 __main__
print(Car.__class__) # 输出 <class 'type'>
4. 实例属性
实例仅仅拥有数据属性,实例属性只是与某个类的实例相关联的数据值,并且可以通过点的方式进行访问,这些值独立于其他实例或类,当一个实例被释放后,它的属性同时也被清除了。
设置实例属性可以在实例创建后的任意时间进行,但通常是在构造函数__init__()
方法中进行设定,因为在实例化对象时,__init__()
方法是最早执行的,__init__()
方法执行完毕,即返回实例对象,实例对象也就拥有了设定好的实例属性。
4.1 实例属性的增
增加一个实例属性。
语法:
实例对象.新属性名 = 属性值
示例:
class Car(object):
"""这是一个Car类"""
# 数据属性
def __init__(self, wheel, color):
self.wheel = wheel
self.color = color
def get_car_info(self):
print('车轮子个数%s,车的颜色%s' % (self.wheel, self.color))
# 函数属性
def move(self):
print('车正在移动。。。')
BMW = Car(4, '红色')
print('增加之前:', BMW.__dict__)
BMW.brand = 'BMW X5'
print('增加之后:', BMW.__dict__)
"""
输出:
增加之前: {'wheel': 4, 'color': '红色'}
增加之后: {'wheel': 4, 'color': '红色', 'brand': 'BMW X5'}
"""
4.2 实例属性的删
删除一个实例属性。
语法:
del 实例对象.新属性名
示例:
class Car(object):
"""这是一个Car类"""
# 数据属性
def __init__(self, wheel, color):
self.wheel = wheel
self.color = color
def get_car_info(self):
print('车轮子个数%s,车的颜色%s' % (self.wheel, self.color))
# 函数属性
def move(self):
print('车正在移动。。。')
BMW = Car(4, '红色')
print('删除之前:', BMW.__dict__)
del BMW.color
print('删除之后:', BMW.__dict__)
"""
输出:
删除之前: {'wheel': 4, 'color': '红色'}
删除之后: {'wheel': 4}
"""
4.3 实例属性的改
修改一个实例属性。
语法:
实例对象.新属性名 = 新属性值
示例:
class Car(object):
"""这是一个Car类"""
# 数据属性
def __init__(self, wheel, color):
self.wheel = wheel
self.color = color
def get_car_info(self):
print('车轮子个数%s,车的颜色%s' % (self.wheel, self.color))
# 函数属性
def move(self):
print('车正在移动。。。')
BMW = Car(4, '红色')
print('修改之前:', BMW.color) # 输出 修改之前: 红色
BMW.color = '黑色'
print('修改之后:', BMW.color) # 输出 修改之后: 黑色
4.4 实例属性的查
查看实例属性直接使用实例对象.实例属性即可。
5.实例方法、类方法、静态方法
5.1 实例方法
实例方法就是正常在类里面定义的方法,不需要任何装饰器装饰,并且第一个参数必须是实例对象self
。
注:实例方法只能通过实例对象访问。
class Car(object):
"""这是一个Car类"""
def __init__(self, wheel, color):
self.wheel = wheel
self.color = color
# 实例方法
def get_car_info(self):
print('车轮子个数%s,车的颜色%s' % (self.wheel, self.color))
BMW = Car(4, '红色')
BMW.get_car_info() # 通过实例对象访问实例方法
5.2 类方法
类方法就是类所拥有的方法,需要用装饰器@classmethod
来标识,对于类方法,第一个参数必须是类对象cls
。
注:类方法可以通过类对象和实例对象访问。
class Car(object):
"""这是一个Car类"""
def __init__(self, wheel, color):
self.wheel = wheel
self.color = color
# 类方法
@classmethod
def run(cls):
print('车子都会跑。。。')
BMW = Car(4, '红色')
BMW.run() # 通过实例对象访问类方法
Car.run() # 通过类对象访问类方法
5.3 静态方法
静态方法通常定义一些与实例和类都没有关系的方法。静态方法需要通过装饰器@staticmethod
来标识,静态方法没有必须得参数,根据方法参数可有可无。
注:类方法可以通过类对象和实例对象访问。
class Car(object):
"""这是一个Car类"""
def __init__(self, wheel, color):
self.wheel = wheel
self.color = color
# 静态方法
@staticmethod
def brand():
print('这是一辆宝马车。')
BMW = Car(4, '红色')
BMW.brand() # 通过实例对象访问静态方法
Car.brand() # 通过类对象访问静态方法
(完)
python学习之【第十七篇】:Python中的面向对象(类和对象)的更多相关文章
- Python学习笔记之基础篇(-)python介绍与安装
Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...
- openresty 学习笔记番外篇:python的一些扩展库
openresty 学习笔记番外篇:python的一些扩展库 要写一个可以使用的python程序还需要比如日志输出,读取配置文件,作为守护进程运行等 读取配置文件 使用自带的ConfigParser模 ...
- openresty 学习笔记番外篇:python访问RabbitMQ消息队列
openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...
- Python(三)基础篇之「模块&面向对象编程」
[笔记]Python(三)基础篇之「模块&面向对象编程」 2016-12-07 ZOE 编程之魅 Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...
- Python学习系列(四)Python 入门语法规则2
Python学习系列(四)Python 入门语法规则2 2017-4-3 09:18:04 编码和解码 Unicode.gbk,utf8之间的关系 2.对于py2.7, 如果utf8>gbk, ...
- 【Python之路】特别篇--Python面向对象(初级篇)
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...
- Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
- Python学习课程零基础学Python
python学习课程,零基础Python初学者应该怎么去学习Python语言编程?python学习路线这里了解一下吧.想python学习课程?学习路线网免费下载海量python教程,上班族也能在家自学 ...
- Python之面向对象类和对象
Python之面向对象类和对象 定义一个类:class 定义类的语法: class Test(object): """ 类里定义一类事物共同的技能. 可以是变量,也可是函 ...
- jackson学习之十(终篇):springboot整合(配置类)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别
XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...
- node与mysql的相互使用————node+mysql
node与mysql的相互使用----node+mysql 为什么选node???因为我是个前端. 为什么选mysql???因为成熟,稳定,听说容易学. 一.mysql数据库: mysql下载和使用我 ...
- Bugku练习
首先我们拿到了一个admin.exe的文件,根据惯例我先用查一下有没有加壳: ???这是怎么回事??? 我于是用了winhex打开看了一下,发现 这不就是data协议吗~~~,把后面的base64解密 ...
- bugku 成绩单
看起来像是SQL注入,先来试试. 输入1,2,3显示的是三个人成绩. 来试试是否存在注入. 输入1,正常.输入1' 错误.输入1’#正常,说明存在注入点. 首先来看下有几列从1开始试,1’ order ...
- 并发新构件之CyclicBarrier
CyclicBarrier:叫做循环栅栏,名字挺好听的.JDK描述:允许一组线程全部等待彼此达到共同屏障点的同步辅助. 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此. 屏障被 ...
- C# 控件 RichTextBox 显示行号,并且与Panel相互联动
我们在使用到WINFORM窗体工作中,要求RichTextBox 加入行号: 之前有看到大牛们写的,但是太复杂繁多,而且有用双TextBox进行联动,非常不错,今天我们尝试RichTextBox +P ...
- Rancher 2.1平台搭建及使用
一.概述 1.1.什么是Rancher Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器. Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求 ...
- jenkins中使用变量
查看jenkins内置变量: 1.新建一个job: 2.构建-增加构建步骤-执行shell: 3.点击 可用的环境变量列表 即可查看 如WORKSPACE : 作为工作空间分配给构建目录的绝对路径 ...
- spark版本定制课程-第1课
spark版本定制课程-第1课 1.学习本课程可以自己动手改进spark,或者给spark增加功能.增加某些官方没有提供的功能,通过本课程希望早就一些顶级spark专家,根据整个社会的需要对spark ...
- 基于SkyWalking的分布式跟踪系统 - 环境搭建
前面的几篇文章我们聊了基于Metrics的监控Prometheus,利用Prometheus和Grafana可以全方位监控你的服务器及应用的性能指标,在出现异常时利用Alertmanager告警及时通 ...