python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象、类、实例、属性封装、实例方法
一、面向对象
1、什么是对象
- #一切皆对象,可以简单地将“对象”理解为“某个东西”
- #“对象”之所以称之为对象,是因为它具有属于它自己的“特征”和“行为”
2、面向过程和面向对象
- #面向过程指的是变量和函数。“散落”在各种文件中,或者在文件的各个位置,相互没有联系,函数与变量没有相关性,非常不利于维护,设计模式不清晰。
- #为此才有面向对象概念的诞生。
- #面向对象指的是相关的变量和函数都“封装”在对象里面,以对象为单位来管理代码。好处在于变量和函数的相关性清晰,便于维护,设计模式也比较清晰;程序员可以配合“继承”来提高代码的可重用性,加强合作开发。
- #面向对象:就是从事物的内部联系,与事物与事物间的外部联系来考虑我们的代码设计的
二、类和实例
- #类与实例,是现实对象在代码中的体现,它们也提供了专门的变量空间
类和实例都是对象
1、类和实例的区别
- #类:是一类事物的抽象概念,不是真实存在的,描绘的是这类事物的共性,例如人、动物、家具。
- #实例:某类事物的具体个体,是该类事物的具体表现,它是具体存在的,例如tuple老师是人中的一个,加菲猫是猫中的一种。
2、创建类,实例
- class Person: #创建一个名字叫人的类
- pass #占位符
- p=Person() #创建实例p,实例出一个具体的人(类的实例化)
3、如何确定类和实例之间的关系
利用isinstance判别函数
- class Person:
- pass
- class Dog:
- pass
- p1=Person() #p1,p2是人类
- p2=Person()
- P3=Dog() #p3是狗类
- print(p1 is p2) #False ,p1,p2虽然都是人类,但是p1不等同于p2
- print(isinstance(p1,Person)) #True,判断p1是不是人类
- print(isinstance(p2,Dog)) #False,判断p2是不是狗类
- print(isinstance(p3,(Person,Dog))) #True,判断p3是不是属于人类或狗类,符合一种就是True
三、属性封装
- #属性表示的是实例的特征,通常标识了一个实例,因此通常存在于实例中
类和实例都是独立存放变量的空间
1、运算符 “.”
用于进行变量空间的运算
- class Person:
- var1='变量1'
- print(Person.var1) #输出直接封装在类中的变量var1(变量1)
- Person.var2='变量2'
- print(Person.var2) #输出后来封装在类中的变量var2(变量2)
- p=Person() #类的实例化
- print(p.var1) #虽然实例p中找不到var1,但根据属性查找规则,在Person类中能够找到,所以仍然能够寻找到var1
- print(p.var2)
- #属性查找规则:查找变量->在实例中查找-->1、找到了,就可输出;2、找不到,转到类中查找变量
2、实例是一个独立存放变量的空间
- class Person:
- pass
- p1=Person()
- p2=Person()
- p1.var='变量1'
- print(p1.var) #输出变量
- print(Person.var) #AttraribileError,类中间找不到,不会转到实例中去找
- print(p2.var) #p2中找没有,转到Person中去找也没有
一个实例的“特征”,就是“属性”
四、实例方法
- #实例方法是一个类中所有实例公共的行为。因此,通常不会在每个实例中存放一个,而是存在与类中
1、什么是实例方法
封装在类中的一种特殊的函数
- class Person:
- def fun():
- print('做些什么')
- Person.fun()
- p=Person()
- p.fun() #TypeError,多传入一个参数
- class Person:
- def fun(self):
- print('参数',self)
- Person.fun('直接通过类调用')
- p=Person()
- print(p)
- p.fun() #默认传入了p这个实例本身
实例方法就是实例的行为
- class Person:
- def eat(self):
- print('{name}eating...'.format(name=self.name))
- p1=Person()
- p1.name='Tuple'
- p2=Person()
- p2.name='Budong'
- p1.eat()#相当于Person.eat(p1),就是直接传入了p1这个参数
- p2.eat()
- # 将name变量与eat函数这两个相关对象通过封装深度的绑定在了类和实例中
实例方法的调用过程与self
- # 实例.方法(参数) -->类.方法(实例,参数) 就是直接将实例传入了函数
- # 通常,将默认会传入的那个参数命名为self,用来表示调用这个方法的实例对象本身
- #方法总是定义在类中,但却叫“实例方法”,因为它在该类所有实例缩共有的行为
四、作业
设计一个银行业务相关的简单程序,让它具有:1、创建账户;2、存款;3、提款;4、展示子账户信息等基本功能
- #首先,我们用面向过程的方法来做
- def account(name,number,balance): #创建账户函数,将输入的账户名,账号,余额返回到一个字典
- return {'name':name,'number':number,'balance':balance}
- def deposit(acct,amount): #存款函数
- if amount<=0:#存款数为负数不得进行存款
- print('余额不得负数')
- else:
- acct[balance]+=amount #利用字典完成存款
- def withdraw(acct,amount): #取款函数
- if amount>acct[balance]:
- print('取款额不得大于余额')
- else:
- acct[balance]-=amount
- def desc(acct): #查询函数
- return '{name}:{balance}'.format(name=acct[name],balance=acct[balance])#返回一个账户名和余额的字符串
- #用“类”来代替没有语义的“字典”
- class Account:
- pass
- def account(name,number,balance):
- acct=Account()
- acct.name=name
- acct.number=number
- acct.balance=balance
- return acct
- def deposit(acct,amount): #存款函数
- if amount<=0:#存款数为负数不得进行存款
- print('余额不得负数')
- else:
- acct.balance+=amount #利用实例完成存款
- def withdraw(acct,amount): #取款函数
- if amount>acct.balance:
- print('取款额不得大于余额')
- else:
- acct.balance-=amount
- def desc(acct): #查询函数
- return '{name}:{balance}'.format(name=acct.name,balance=acct.balance)#返回一个账户名和余额的字符串
- #既然如此,为啥不直接放到类里面呢,这便是用过“面向对象”的思路来设计
- class Account:
- def account(self,name,number,balance):
- self.name=name
- self.number=number
- self.balance=balance
- return self
- def deposit(self,amount): #存款函数
- if amount<=0:
- print('余额不得负数')
- else:
- self.balance+=amount
- def withdraw(self,amount): #取款函数
- if amount>acct.balance:
- print('取款额不得大于余额')
- else:
- self.balance-=amount
- def desc(self): #查询函数
- return '{name}:{balance}'.format(name=self.name,balance=self.balance)
python进阶01 面向对象、类、实例、属性封装、实例方法的更多相关文章
- Python的类实例属性访问规则
一般来说,在Python中,类实例属性的访问规则算是比较直观的. 但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此. 在这里,我们需要明白以下几个地方: 1.Pytho ...
- Python进阶(十三)----面向对象
Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...
- Python 进阶_OOP 面向对象编程_组合与继承
#目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- Python 进阶_OOP 面向对象编程_实例属性和方法
目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...
- Python 进阶_OOP 面向对象编程_类属性和方法
目录 目录 类属性 调用类属性 查看类属性 特殊的类属性 类方法 真构造器 __new__ 类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象 ...
- Python实用笔记 (22)面向对象编程——实例属性和类属性
由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(se ...
- Python中级 —— 01面向对象进阶
面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...
- Python 进阶_OOP 面向对象编程_类和继承
目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类 ...
随机推荐
- linux系统 标准目录及其内容
路径名 操作系统 内容 /bin 所有 最核心的操作系统命令 /boot LS 内核和加载内核所需的文件 /dev 所有 伪终端,磁盘,打印机等的设备项 /etc 所有 关键的启动文件和配置文件 ...
- JAVA- 清除数组重复元素
清除数组重复元素并打印新数组. import java.util.*; public class Repeat { public static void main(String[] args) { / ...
- 最短路径问题----Dijkstra算法的解释
先上图: 现在要找到地点V1到其余各个地点的最短路径(图中数字的单位默认为km.).有一个原则是:永远找最小,确保无更小. 第一步:v1->v1,v1->v2,...v1->v7的距 ...
- POJ 3620 Avoid The Lakes(dfs算法)
题意:给出一个农田的图,n行m列,再给出k个被淹没的坐标( i , j ).求出其中相连的被淹没的农田的最大范围. 思路:dfs算法 代码: #include<iostream> #inc ...
- Java企业微信开发_10_未验证域名归属,JS-SDK功能受限
1.现象: 在企业微信后台填写可信域名后,提示:未验证域名归属,JS-SDK功能受限,如下图: 点击“申请域名校验”后, 注意:域名根目录 当时一直不清楚这个域名根目录在哪里,最后让我给试出来了 2. ...
- linux命令学习笔记(24):Linux文件类型与扩展名
Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序 而创建的比如file.txt.file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux ...
- ubuntu关闭cups服务
本人使用的ubuntu10.10每次开机时使用nmap扫描127.0.0.1的时候总是能发现一个631端口开启,在/etc/services找到 631端口是网络打印机服务,但对于我一个普通用户来说这 ...
- Xshell 主机和远程机之间的文件传输
(1)宿主机传输文件到远程机 方法1:直接拖动文件至xshell远程机命令行界面 方法2:远程机命令行输入rz打开文件选择框 (2)远程机传输文件到宿主机 远程机命令行界面上输入sz xxx.txt( ...
- BZOJ1146:[CTSC2008]网络管理
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...
- POJ2349(求生成树中符合题意的边)
Arctic Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14977 Accepted: 4777 D ...