day019python之面向对象基础1
面向对象基础
1 面向对象基础
1.1 面向对象的由来
- python中一切皆对象
- 定义一个类,类有属性(变量、特征),有方法(函数、技能)
1.2 面向对象编程介绍
1.2.1 回顾面向过程设计
核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么然后干什么
优点:复杂问题流程化,进而简单化(一个复杂的问题分成一个个小的步骤去实现)
缺点:一套流水线或流程解决一个问题,生产汽水的就无法生产汽车,即使可以也要大改,牵一发而动全身
应用场景:一旦完成基本很少改变,如Linux内核,git等
1.2.2 面向对象设计
核心是对象二字,python中一切皆对象(对象是特征与技能的结合体),面向对象只用来解决扩展性
优点:解决了程序的扩展性,对某一个对象的单独修改会立即反映到整个体系中
缺点:Ⅰ编程的复杂难度远高于面向过程,易出现过度设计
Ⅱ无法像面向过程的程序精准预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,谁也无法准确的预测最终结果
应用场景:需求经常变化的软件,一般集中于用户层,互联网应用,企业内部软件,游戏等
2 类与对象
2.1 基本使用
造一个张三对象,他有体重、身高,还有睡觉技能(特征与技能的结合体:属性和方法)
定义一个类
# 类 person
class Person:
# 特征(属性)
height = 180
weight = 90
# sleep函数,就是方法,技能
def sleep(self):
print("睡觉技能")
- 定义一个对象
# 对象 zhangsan
zhangsan = Person()
- 使用对象
print(zhangsan.height) # 180
print(zhangsan.weight) # 90
zhangsan.sleep() # 睡觉技能
2.2 示例
- 定义一个学生类(学习属性,选课技能),实例化得到一个学生对象
class Student: # 类名尽量用驼峰
school = 'oldboy'
def choose_course(self): # 方法,特殊函数,定义在类内部,有一个参数self
print("选课技能")
student = Student() # 类的实例化,取得对象
# __dict__是类的名称空间
print(Student.__dict__) # 以__开头的是写在类中的属性和方法,都在Student中
# 通过Student取得school
print(Student.school) # oldboy
print(Student.choose_course) # <function Student.choose_course at 0x000001F299BC78B0>
print(student.school) # oldboy
student1 = Student()
print(student1.school) # oldboy
3 对象属性的查找顺序
对象有自己属性时,优先使用自己的,没有才用类的
先从自己的名称空间找,没有则去类中找,如果类中也没有就报错
对象调用方法,使用的就是类中定义的方法
类中定义的方法,是绑定给对象的,对象来使用
哪个对象来调用方法,self就是哪个对象
对象属性的查找顺序:对象自己-->类中-->报错
对象方法的查找顺序:所有对象都用类的方法-->方法有self参数,通过self参数区分是哪个对象调用的
类名._dict_ 类的名称空间
对象.__dict__ 对象的名称空间
类中的属性应该是对象的共有属性,如果是对象自己的,需要放到对象自己的名称空间
class Student:
school = 'oldboy'
def choose_course(self):
print(self.school)
print('选课技能')
# 定义两个不同的新对象
s1 = Student()
s2 = Student()
# 因为s1对象和s2对象的名称空间中,都没有school属性,因此共用类的名称空间中的school属性
print(s1.school) # oldboy
print(s2.school) # oldboy
# 此时s1转学去了北大
s1.school = '北大'
print(s1.school) # 北大
print(s2.school) # oldboy
print(Student.school) # oldboy
# 对象有自己属性时,优先使用自己的,没有才用类的
# 先从自己的名称空间找,没有则去类中找,如果类中也没有就报错
# print(s1.xxx) # 报错
# 对象调用方法,使用的就是类中定义的方法
# 类中定义的方法,是绑定给对象的,对象来使用
# 哪个对象来调用方法,self就是哪个对象
s1.school = '北大'
s2.school = '清华'
s1.choose_course() # 北大 选课技能
s2.choose_course() # 清华 选课技能
# 对象属性的查找顺序:对象自己-->类中-->报错
# 对象方法的查找顺序:所有对象都用类的方法-->方法有self参数,通过self参数区分是哪个对象调用的
# 类名.__dict__ 类的名称空间
# 对象.__dict__ 对象的名称空间
# 类中的属性应该是对象的共有属性,如果是对象自己的,需要放到对象自己的名称空间
print(s1.__dict__) # {'school': '北大'}
s1.name = 'ccc'
s1.age = 18
print(s1.__dict__) # {'school': '北大', 'name': 'ccc', 'age': 18}
# 对象不能改掉类的属性
class Student:
school = 'oldboy'
def choose_course(self): # self必须写,哪个对象调,self就是哪个对象
print(self.school)
print("选课技能")
s1 = Student()
s1.school = "北大" # 改的是对象自己的名称空间属性,改不到类的属性
# 更改类的属性(不用改源码的方式)
Student.school = '北大'
s1 = Student()
s2 = Student()
print(s1.school) # 北大
print(s2.school) # 北大
s1.school = "清华"
print(s1.school) # 清华
print(s2.school) # 北大
# 统计一个类被实例化多少次
class Student:
count = 0
# 错误方法
s1 = Student()
s1.count += 1 # 实例化一次 数字+1
s2 = Student()
s2.count += 1 # 实例化一次 数字+1
print(Student.count) # 打出来永远是0
# 方式二
s1 = Student()
Student.count += 1 # 实例化一次 数字+1
s2 = Student()
Student.count += 1 # 实例化一次 数字+1
print(Student.count) # 2
print(Student.count) # 2
print(s1.count) # 2
s1 = Student()
Student.count += 1 # 实例化一次 数字+1
s2 = Student()
Student.count += 1 # 实例化一次 数字+1
s1.count += 1 # 加了这句话
print(Student.count) # 2
print(s1.count) # 3
Student.count += 10 # 修改类的count属性
print(s1.count) # 打印s1的count属性,由于s1用自己的,就是3
print(s2.count) # 打印s1的count属性,由于s1没有,用类的,类的是12,就是12
4 对象的绑定方法
函数:普通函数def定义的函数,有几个参数就要传几个参数
方法:绑定给某个对象的,绑定给谁,谁来调用,谁来调用就会自动把谁传过来,传给self
class Student:
def choose_course(self): # 定义在类内部的函数,就是绑定给对象的方法
# print(self.name) # 通过self来区分,到底是哪个对象调用了自己的绑定方法
print('%s选了课' % self.name)
s1 = Student()
s1.name = 'ccc' # 自己名称空间加了name属性
s1.choose_course() # 绑定给对象的方法,对象来调用,自动把对象传进去
s2 = Student()
s2.name = 'yyy' # 自己名称空间加了name属性
s2.choose_course()
# print(Student.name) # 报错
类可以调用方法,类来调用,就是个普通函数
s1 = Student()
s1.name = 'zzz'
Student.choose_course(s1)
类可以调用对象的绑定方法,但是需要手动把对象传进来,现在choose_course就是个普通函数,有几个参数,就传几个参数
5 对象的初始化
对象在实例化的时候,赋初值(给对象一些属性)
class Student:
def choose_course(self):
print('选课')
# 之前的方案
student1 = Student()
student1.name = 'ccc'
student1.age = 18
# 新方案
class Student:
def __init__(self):
self.name = 'ccc'
self.age = 18
def choose_course(self):
print('选课')
student1 = Student() # 只要是类实例化得到对象,就会自动触发__init__的执行
print(student1.age) # 18
print(student1.name) # ccc
student2 = Student()
print(student2.name) # ccc
# 定死了,不行
# __init__的终极使用
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def choose_course(self):
print('选课')
student = Student(name='ccc', age=18) # 这种初始化会触发类的__init__的执行,并把参数传入
print(student.name)
yyy = Student(name='yyy', age=20)
print(yyy.name)
# 按位置传
# cc=Student(20,'drrug')
ccc = Student('drrug', 20)
print(ccc.name)
6 阶段总结一
# 1 类与对象
class 类名:
pass
对象 = 类名()
# 2 之前一直用的字典,列表,数字...其实都是一些类的对象
# 3 对象的属性查找
对象.属性-->先从对象自己的名称空间中找-->类的名称空间找-->报错
类中定义的属性,对象只能使用,不能修改
对象只能修改自己名称空间的
# 4 对象的绑定方法
定义在类内部的函数,就是对象的绑定方法,对象来调用,会自动把对象传入(self)
类也可以来调用,类来调用,就是普通函数,有几个参数就要传几个参数
函数就是def 定义的函数,有几个参数就要传几个参数
方法是绑定给对象的,由对象来调用,特殊之处是会把对象自身传入
class Student:
def choose_course(self):
print(self) # <__main__.Student object at 0x000001FD4EA85B50>
s = Student()
s.choose_course() # choose_course就叫方法
Student.choose_course(1) # 就是普通函数 1
print(s.choose_course) # <bound method Student.choose_course of <__main__.Student object at 0x0000025A0E90F1F0>>
print(Student.choose_course) # <function Student.choose_course at 0x0000025A0E917430>
# 5 __init__的使用
初始化方法,类加括号实例化得到对象时,会触发它的执行
可以在初始化方法中,给对象赋初值
class Student:
def __init__(self, name, age, school='北大'): # 如果不写,它就不执行
self.name = name
self.age = age
self.school = school
def sleep(self):
print('%s睡着了' % self.name)
s1 = Student('ccc', 19, school='清华')
s2 = Student('yyy', 18)
s3 = Student('zzz', 22)
# print(s.school)
s3.sleep() # zzz睡着了
s2.sleep() # yyy睡着了
day019python之面向对象基础1的更多相关文章
- 了解JavaScript 面向对象基础 & 原型与对象
面向对象语言中的对象 老是能听到什么基于对象, 面向对象. 什么是对象, 如果有面向对象基础的人可以无视了, 下面举个简单的例子给大家讲讲面向对象中, 对象的定义, 这个是比较通用的, 不过对于JS来 ...
- MYSQL、PHP基础、面向对象基础简单复习总结
一.MYSQL 1.配置MySql 第一步安装服务器(apache). 第二部安装MySql界面程序 2 ...
- 从零开始学Python第六周:面向对象基础(需修改)
标签(空格分隔): 面向对象 一,面向对象基础 (1)面向对象概述 面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...
- python面向对象基础
面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...
- java基础学习05(面向对象基础02)
面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...
- java基础学习05(面向对象基础01--类实例分析)
面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...
- java基础学习05(面向对象基础01)
面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
- 【重走Android之路】【Java面向对象基础(三)】面向对象思想
[重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinkin ...
随机推荐
- leetcode 33和 leetcode81
//感想: 1.对于这两题,我真的是做到吐,这篇博客本来是昨晚准备写的,但是对于这个第二题,我真的做到头痛,实在是太尼玛的吐血了,主要是我也是头铁,非要找到那个分界点. 2.其实之前在牛客网上做过非常 ...
- oracle整表数据被误删除之寻踪
问题描述 开发同事在在14点左右发现任务表task_info数据不正确,3个小时之前的数据消失了,数据截至时间11:38:27 问题分析 查询过dba_source,只找到一个删除该表的存储过程,而且 ...
- Spring Boot第一天
1.首先在idea中创建一个maven项目,创建成功后在pom.xml中添加SpringBoot相关的依赖 <!--引入SpringBoot相关的依赖--> <parent> ...
- 【???】今天上午的考试题——区间dp和字符串/线性筛的综合应用
T3还没有打出来,就先放两道. ---------------------------------------------------------- T1:密码破译 温温手下的情报部门截获了一封加密信 ...
- Docker中搭建FastDFS文件系统(多图)
关于FastDFS FastDFS 是以 C 语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载)等,特别适合以文件为载体的在线服务,如 ...
- JZOJ8月4日提高组反思
JZOJ8月4日提高组反思 被一堆2018&2019&2020的巨佬暴打 又是愉快的爆0的一天呢 T1 看了看题 没想法 暴力走起 求个质因数呀,二分呀-- 然后就炸了 正解预处理加二 ...
- 2017 Mid Central Regional F.Orderly Class(大水题)
这两天刷了两道过去的原题,看看思维还是8太行. 这道题问给出两个字符串,要求只翻转一次,问有几种不同的方法使得a串变成b串 我一开始没看到只翻转一次,还以为是个计数 + 字符串dp大难题,心想当年的学 ...
- moviepy音视频剪辑:追踪人脸打马赛克的三种实现方式
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在moviepy官网的案例<Tracking and blurring someone's face>和CSDN的moviepy大神uc ...
- 第3.8节 Python百分号占位符的字符串格式化方法
一. 概念 格式化字符串就是将一些变量转换为字符串并按一定格式输出字符串,包括指定字符的位置.对齐方式.空位补充方式等.Python提供了多种字符串格式设置方法.本节先介绍一种简 ...
- 在Python实现print标准输出sys.stdout、stderr重定向及捕获的简单办法
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 Python中的标准输出和错误输出由sys模块的stdout.stde ...