前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念、类的定义、类属性、实例属性及实例方法等。

一、类和对象的概念


问题:什么是类?什么是实例对象?

类:是一类事物的抽象概念,不是真实存在的,描绘了该类事物共有的特征和行为

  • 例如:猫类、狗类、鸟类、车类等

实例对象:某类事物的具体个体,是该类事物的具体表现,它是真实存在的

  • 例如:“张三”是具体的某个“人“,”二哈“是具体的某个”狗“

二、类的定义


关键字:class

定义类的方法:

方式一:class 类名:

方式二:class 类名(object):

注意:方式一、方式二本质上是一样的,没有任何区别,只是写法不一样,他们都继承object这个基类。这里简单解释一下,在python3以前,不继承object类会少很多可操作对象,这些都是类中的高级特性,但在python3以后所有类都默认继承这个object基类了。

类名的命名规范:

1)遵循标识符的命名规范,即由字母、数字及下划线组成且不能以数字开头,不能使用关键字。

2)建议使用大驼峰命名法(每个单词的第一个字母大写,例如:MyClass、TestCase)

三、类属性和实例属性


1.类属性

什么是类属性?就是一类事物的共同特征,比如狗类,共同特征:叫声(汪汪汪)、四只脚等。

类属性:就是定义在类中的变量

类属性的访问:

  • 类可以直接访问类属性
  • 该类的实例对象也可以访问类属性
class Dog:  # 创建一个狗类
cry = '汪汪汪' # 类属性
leg = '四只脚' # 类属性 wangcai = Dog() # 创建一个实例对象,旺财是一只具体的狗
print('通过类名直接访问类属性:'.format(Dog.cry)) # 通过类名直接访问类属性
print('通过实例对象访问类属性:'.format(wangcai.cry)) # 通过实例对象访问类属性

运行结果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
通过类名直接访问类属性:
通过实例对象访问类属性: Process finished with exit code 0

2.实例属性

什么是实例属性?就是实例对象特有的属性,比如旺财是一个实例对象,他的名字叫旺财,这个名字就是一个实例属性

实例属性:实例对象特有的属性,添加实例属性的方式:

  • 实例对象.属性 = 属性值
  • 定义在类里的__init__方法里的变量

实例属性的访问:实例属性只有该实例对象自己能访问

class Dog:  # 创建一个狗类
cry = '汪汪汪' # 类属性
leg = '四只脚' # 类属性 def __init__(self, name, age):
"""实例对象初始化方法"""
self.name = name
self.age = age # 创建一个实例对象,因为有初始化方法__init__,定义了两个必需参数,因此实例化对象时需要传两个参数
wangcai = Dog(name='旺财', age='') # wangcai = Dog('旺财', '4') 这种写法也可以,顺序对应参数即可
dog_name = wangcai.name
dog_age = wangcai.age
print('狗的名字:{}'.format(dog_name)) # 实例属性只能该实例对象访问
print('狗的年龄:{}'.format(dog_age)) # 通过 实例对象.属性 = 属性值 再添加一个实例属性
wangcai.skill = '爬树'
print(wangcai.skill) # print(Dog.name) # 实例属性是不能通过类去访问的,会报错 jojo = Dog('jojo', 3) # 实例化对象,一只叫jojo的狗
dog_name2 = jojo.name # jojo只能访问自己的属性,不能访问其他实例对象(旺财)的属性
print('狗的名字:{}'.format(dog_name2))

运行结果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
狗的名字:旺财
狗的年龄:4
爬树
狗的名字:jojo Process finished with exit code 0

在上面例子中使用了一个__init__方法,这些是什么方法呢?被双下划线包起来的方法,是python中有特殊语义的方法,也叫魔术方法,注意自定义方法时不要用这个格式命名。魔术方法不需要手动调用,在指定的条件下会自动触发,而这个__init__方法是在创建实例对象时就会自动触发。

3.关于self的理解

细心的你是不是发现了?在上面的例子,类里的init方法还有一个参数self,self是什么?有什么作用?

self可以理解为自己,即实例对象本身,哪个实例对象去调用,这个self就指向哪个实例对象,python解释器会把这个实例对象作为第一个参数传给self。这样是不是就能解释为什么实例属性只能该实例对象去访问呢。如果觉得有点绕,多理解几遍,多敲几遍吧!

四、实例方法


1.实例方法的定义

  • 实例方法直接定义在类中
  • 实例方法的第一个参数为self(这个参数必须要写)

2.实例方法的访问

  • 通过实例对象直接调用,该类的实例对象都可以访问,访问实例方法时会自动将实例对象本身作为第一个参数传给self接收
  • 通过类调用实例方法时,要传递一个self参数,即传递一个实例对象(很少用这种方法)
class Dog:  # 创建一个狗类
cry = '汪汪汪' # 类属性
leg = '四只脚' # 类属性 def __init__(self, name, age):
"""实例对象初始化方法"""
self.name = name
self.age = age def skill(self):
sk1 = '爬树' # 这里定义的只是一个方法里的变量,其他方法是无法调用的
print('技能1:{}'.format(sk1)) def skill2(self, sk2):
self.sk2 = sk2 # 接收参数sk2,这里为什么要用self.去接收?因为这样相当于定义了一个实例属性,self就是指向实例对象
print('技能2:{}'.format(self.sk2)) def skill3(self):
print('技能3:{}'.format(self.sk2)) # 这里访问self.sk2就能访问
print('技能4:{}'.format(sk1)) # 这里访问sk1会报错,找不到 wangcai = Dog(name='旺财', age='') # wangcai = Dog('旺财', '4') 这种写法也可以,顺序对应参数即可
dog_name = wangcai.name
dog_age = wangcai.age
print('狗的名字:{}'.format(dog_name)) # 实例属性只能该实例对象访问
print('狗的年龄:{}'.format(dog_age)) wangcai.skill() # 通过实例对象直接调用实例方法
wangcai.skill2('抓老鼠') # 调用实例方法,该实例方法定义了一个必须参数
wangcai.skill3()

运行结果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
Traceback (most recent call last):
狗的名字:旺财
File "D:/learn/python18_http_request/exercise/test.py", line 31, in <module>
狗的年龄:4
技能1:爬树
技能2:抓老鼠
技能3:抓老鼠
wangcai.skill3()
File "D:/learn/python18_http_request/exercise/test.py", line 20, in skill3
print('技能4:{}'.format(sk1)) # 这里访问sk1会报错,找不到
NameError: name 'sk1' is not defined Process finished with exit code 1

下面演示一个通过类访问实例方法(了解即可):

class Dog:  # 创建一个狗类
cry = '汪汪汪' # 类属性
leg = '四只脚' # 类属性 def __init__(self, name, age):
"""实例对象初始化方法"""
self.name = name
self.age = age def skill(self):
sk1 = '爬树' # 这里定义的只是一个方法里的变量,其他方法是无法调用的
print('技能1:{}'.format(sk1)) def skill2(self, sk2):
self.sk2 = sk2 # 接收参数sk2,这里为什么要用self.去接收?因为这样相当于定义了一个实例属性
print('技能2:{}'.format(self.sk2)) wangcai = Dog(name='旺财', age='') # wangcai = Dog('旺财', '4') 这种写法也可以,顺序对应参数即可
dog_name = wangcai.name
dog_age = wangcai.age
print('狗的名字:{}'.format(dog_name)) # 实例属性只能该实例对象访问
print('狗的年龄:{}'.format(dog_age)) # 通过类调用实例方法:要传递一个self参数,即传递一个实例对象
Dog.skill(wangcai) # 传递一个实例对象
Dog.skill2(wangcai, '抓老鼠') # 传递完实例对象再传方法里的必需参数

运行结果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
狗的名字:旺财
狗的年龄:4
技能1:爬树
技能2:抓老鼠 Process finished with exit code 0

15、python面对对象之类和对象的更多相关文章

  1. Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

    目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...

  2. Python面对对象相关知识总结

    很有一段时间没使用python了,前两天研究微信公众号使用了下python的django服务,感觉好多知识都遗忘了,毕竟之前没有深入的实践,长期不使用就忘得快.本博的主要目的就是对Python中我认为 ...

  3. Python - 面对对象(基础)

    目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...

  4. Python - 面对对象(进阶)

    目录 Python - 面对对象(进阶) 类的成员 一. 字段 二. 方法 三. 属性 类的修饰符 类的特殊成员 Python - 面对对象(进阶) 类的成员 一. 字段 字段包括:普通字段和静态字段 ...

  5. 小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系)

    小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系 1. 依赖关系. 最轻的一种关系 在方法中引入另一个类的对象 class Elephant: def __init__(sel ...

  6. 小学生绞尽脑汁也学不会的python(面对对象-----成员)

    小学生绞尽脑汁也学不会的python(面对对象-----成员) 成员 class Person: def __init__(self, name, num, gender, birthday): # ...

  7. 16、python面对对象之类和继承

    前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名 ...

  8. Python语言基础07-面向对象编程基础

    本文收录在Python从入门到精通系列文章系列 1. 了解面对对象编程 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编 ...

  9. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

随机推荐

  1. 页面在谷歌浏览器和IE浏览器顶部多出空白行,火狐显示正常

    引起这个问题的原因是用系统自带记事本打开过Tinkphp的模板文件,因为记事本不支持UTF8无BOM格式编码,打开之后这个编码格式丢失,转为ANSI格式的编码了: 解决的办法是:用Notepad++或 ...

  2. C# 将DataGridView中显示的数据导出到Excel(.xls和.xlsx格式)—NPOI

    前言 https://blog.csdn.net/IT_xiao_guang_guang/article/details/104217491  本地数据库表中有46785条数据,测试正常  初次运行程 ...

  3. c++工程编译记录

    test3.c #include <stdio.h> #include <cpptest/cpptest.h> int test(int argc,char **argv); ...

  4. 吴裕雄 python 机器学习——数据预处理过滤式特征选取VarianceThreshold模型

    from sklearn.feature_selection import VarianceThreshold #数据预处理过滤式特征选取VarianceThreshold模型 def test_Va ...

  5. 【PAT甲级】1107 Social Clusters (30分)(非递归并查集)

    题意: 输入一个正整数N(<=1000),表示人数,接着输入N行每行包括一个他的爱好数量:和爱好的序号.拥有相同爱好的人们可以默认他们在同一个俱乐部,输出俱乐部的数量并从大到小输出俱乐部的人数( ...

  6. iptables详解(3):增删改存

    总结一下iptables规则管理的增删改存命令: 1.添加规则: 1)在指定表的指定链的末尾添加一条规则,-A选项表示在末尾添加,-j表示采取的动作,例如DROP.REJECT.ACCEPT 命令语法 ...

  7. 树莓派4B踩坑指南 - (11)免费搭建网站(宝塔,花生壳)

    目录 宝塔 安装宝塔面板 登录及初始化设置 安装网站 花生壳 安装花生壳 设置花生壳 测试 问题(未解决但不影响使用) 网站统计 树莓派这么低的功耗,不用来当服务器总感觉有点浪费...完成效果:htt ...

  8. SQL语句 分组 多行合并成一行

    ,,'')) FROM Table d GROUP by Id 另外: sql 单引号转义:两个单引号转义为一个单引号 set @sql='STUFF((SELECT '','' + Names FR ...

  9. Vue-路由跳转的几种方式和路由重定向

    一.标签路由 router-link 注意:router-link中链接如果是'/'开始就是从根路由开始,如果开始不带'/',则从当前路由开始. 1.不传参 <router-link :to=& ...

  10. 红帽RHCE培训-课程3笔记内容2

    9 NFS 9.1 NFS基础 目标 .使用NFS将文件系统连接到客户端,并使用IP 地址控制访问 .使用NFS将文件系统连接到客户端,并使用kerberos 来控制访问 .配置用户名和密码控制访问的 ...