【16】有关python面向对象编程
面向对象编程
一、第一个案例---创建类
#__author:"吉"
#date: 2018/10/27 0027
#function: # 设计类:
'''
1 类名:首字母大写,见名思意
2 属性:驼峰原则
3 行为:见名思意,驼峰法
说明:类不占空间,实例化对象占用空间!
''' # 格式,object是父类,超类
'''
类名(object):
属性
行为
'''
class Peoson(object):
name = 'zhanglei'
age = 24
weight = 70 def run(self):
print("跑!")
def eat(self):
print('吃')
二、使用类实例化对象
#__author:"吉"
#date: 2018/10/27 0027
#function: # 设计类:
'''
1 类名:首字母大写,见名思意
2 属性:驼峰原则
3 行为:见名思意,驼峰法
说明:类不占空间,实例化对象占用空间!
''' # 格式,object是父类,超类
'''
类名(object):
属性
行为
''' class Peoson(object):
name = 'zhanglei'
age = 24
weight = 70 def run(self):
print("跑!") def eat(self):
print('吃') def changeName(self,name):
self.name = name # 实例化对象
'''
格式:对象名= 类名(参数列表信息)
'''
peoson1 = Peoson()
print(peoson1.name,peoson1.age,peoson1.weight)
print(peoson1.eat())
print(peoson1.run()) # 原理
'''
变量是在栈区,对象是在堆区。 '''
三、访问对象的属性和方法
#__author:"吉"
#date: 2018/10/27 0027
#function: # 设计类:
'''
1 类名:首字母大写,见名思意
2 属性:驼峰原则
3 行为:见名思意,驼峰法
说明:类不占空间,实例化对象占用空间!
''' # 格式,object是父类,超类
'''
类名(object):
属性
行为
''' class Peoson(object):
name = 'zhanglei'
age = 24
weight = 70 def run(self):
print("跑!") def eat(self):
print('吃') def changeName(self,name):
self.name = name # 实例化对象
'''
格式:对象名= 类名(参数列表信息)
'''
peoson1 = Peoson() # 访问属性
'''
变量是在栈区,对象是在堆区。 '''
print(peoson1.name,peoson1.age,peoson1.weight)
peoson1.name = 'jiji'
peoson1.age = 33
peoson1.weight = 90 print(peoson1.name,peoson1.age,peoson1.weight) peoson1.changeName('lala') print(peoson1.name,peoson1.age,peoson1.weight)
四、构造函数
#__author:"吉勇佳"
#date: 2018/10/27 0027
#function: '''
构造函数:__init__() 是在创建类的时候自动调用,不写出这个
构造函数的话,默认是一个空的构造函数什么页不执行。 ''' class Peoson(object):
def __init__(self,name,age,height,weight):
self.name = name
self.age = age
self.height = height
self.weight = weight def run(self):
print("跑!") def eat(self):
print('吃') def changeName(self,name):
self.name = name # 实例化对象
p1 = Peoson("jiyongjia",24,177,78) print(p1.name,p1.age,p1.height,p1.weight)
p1.changeName('zhanglei')
print(p1.name,p1.age,p1.height,p1.weight) # self 原理
'''
1、哪个对象调用,self就代表那个对象。
'''
五、self.__class__()的使用创建实例与析构函数
class Peoson(object):
def __init__(self,name,age,height,weight):
self.name = name
self.age = age
self.height = height
self.weight = weight
# 这里是析构函数
def __del__(self):
print("我是析构函数") def run(self):
print("跑!") def eat(self):
print('吃') def changeName(self,name):
self.name = name # 创建对象函数 self.__class__ 是代表类名的
def createObj(self,name):
p=self.__class__(name,24,56,89)
print(p.name,p.age,p.weight,p.height) # 即 执行p1的一个方法即可创建新的对象。
p1 = Peoson("丽丽",33,53,222)
print(p1.name,p1.age,p1.height,p1.weight)
p1.createObj("狗熊") '''
输出:丽丽 33 53 222
狗熊 24 89 56
我是析构函数
我是析构函数
'''
print(p1.name)
六、__str__()与__repr__()比较
'''
重写
__str__()
str方法是给用户用的,用于返回用户需要的结果信息、
__repr__()
如果换成__repr__()是得到与str相同的结果。是在黑屏终端直接敲对象名再回车的方法
注意:在没有str方法但是有repr的时候,repr 就相当于str,只是repr用于黑屏终端
''' class Peoson(object):
def __init__(self,name,age,height,weight):
self.name = name
self.age = age
self.height = height
self.weight = weight
# 这里是析构函数
def __del__(self):
print("我是析构函数") def run(self):
print("跑!") def eat(self):
print('吃') def changeName(self,name):
self.name = name # 创建对象函数 self.__class__ 是代表类名的
def createObj(self,name):
p=self.__class__(name,24,56,89)
print(p.name,p.age,p.weight,p.height) # 如果换成__repr__()是得到相同的结果。是在黑屏终端直接敲对象名再回车的方法
def __str__(self):
pass
# return "这里是str"
# return self.name
#返回多个值的话用如下
return "%s-%d-%d" % (self.name,self.age,self.weight) # 如果要打印出所有的属性信息呢?
p1 = Peoson("嘉嘉",44,222,336) # 不写def __str__()方法的时候,打印出的是该对象的地址信息
print(p1)
'''
输出:<__main__.Peoson object at 0x0000000002564978>
''' # 写了__str__()函数是 打印出的自己需要返回的信息数据,此时p1等价于p1.__str__()
print(p1)
七、练习-面向对象作业:
枪设计子弹 设计一次少一个子弹,没子弹了提示无法射击
#__author:"吉"
#date: 2018/10/27 0027
#function: # 枪设计子弹 设计一次少一个子弹,没子弹了提示无法射击 class Gun(object):
def __init__(self,name,bulletNum):
self.name = name
self.bulletNum = bulletNum def shot(self):
self.bulletNum =self.bulletNum - 1
if self.bulletNum+1 != 0:
print("此枪型号是:%s,此次射击成功!子弹减少1发,余量为:%d" %(self.name,self.bulletNum))
else:
print("*************射击失败,子弹数为0.已经为您子弹加弹5发!请重新射击!**************")
self.bulletNum = 5 gun = Gun("AK47",5)
# 射击敌人
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot() '''
输出:
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:4
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:3
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:2
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:1
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:0
*************射击失败,子弹数为0.已经为您子弹加弹5发!请重新射击!**************
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:4
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:3
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:2
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:1
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:0
*************射击失败,子弹数为0.已经为您子弹加弹5发!请重新射击!**************
此枪型号是:AK47,此次射击成功!子弹减少1发,余量为:4 '''
八、如何创建私有属性,在外部无法被访问或者修改
#1 指定私有属性,在外部无法更改:即在属性前加两个下划线 如__money
#2 在python中只有某属性前边有两个下划线的才叫 私有属性,而__money__这种不叫,这是特殊属性。
#3 _money 也不是私有属性,但是当我们看到这样的变量时,我们应该约定俗成的把它看做私有的。本质不是私有,是可以访问的。
# 指定私有属性,在外部无法更改:即在属性前加两个下划线 如__money class Person(object):
def __init__(self,name,age,height,weight,money):
self.name = name
self.age = age
self.height = height
self.weight = weight
self.__money= money def run(self):
print("跑!") def eat(self):
print('吃') def changeName(self,name):
self.name = name # 创建对象函数 self.__class__ 是代表类名的
def createObj(self,name):
p=self.__class__(name,24,56,89,10000)
print(p.name,p.age,p.weight,p.height,p.__money) # 即 执行p1的一个方法即可创建新的对象。
p1 = Person("丽丽",33,53,222,20000) print(p1.name,p1.__money) #此处出错,在外部无法访问私有
如果想在外边访问的话,可以把私有的属性放在方法里面,调用方法,即可访问私有属性。如:
def run(self):
print("跑!")
print("工资",self.__money)
总结:访问或者修改私有属性的时候可以通过固定的两个方法来达到修改和访问,同时,方法中可以对数据进行过滤。
# 对于处理私有属性的方法---设置值的方法
def SetMoney(self,money):
if money<0:
print("输入的钱不能小于0")
else:
self.__money = money # 对于访问私有属性的方法
def GetMoney(self):
return self.__money
# 其实,不能访问__money的原因是因为 python把私有的属性改变为了 _Person__money ,
# 即仍然是可以访问的。但是应该遵循规则,不这么访问,
p1._Person__money = 70
print(p1.GetMoney()) 上述是依然还可以把私有属性进行修改。
父类的文件信息:
class People(object):
def __init__(self,name,age):
self.name=name
self.age=age 子类中调用上边的父类
from people import People class Student(People):
def __init__(self,name,age,faceValue):
# 继承父类的__init__()
super(Student,self).__init__(name,age)
self.faceValue = faceValue
stu = Student("玲",22,100)
print(stu.name,stu.age,stu.faceValue) 输出
玲 22 100
# 总结:
# 我们发现Student类中并无这两个属性信息,这两个属性是调用的父类的__init__中的属性。
# 总结: # 我们发现Student类中并无这两个属性信息,这两个属性是调用的父类的__init__中的属性。
【16】有关python面向对象编程的更多相关文章
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- 图解python | 面向对象编程
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
随机推荐
- Java 范例 - 字节处理
前言 Java 编程中常会遇到需要进行字节处理的地方,本篇文章就来探讨编程中会遇到的字节处理问题. 字节序 字节序(endianness)是对于多字节数据来说的,它描述了多字节数据存储的顺序,分为大端 ...
- CSS 基础:HTML 标记与文档结构(1)<思维导图>
这段时间利用一下间隙时间学习了CSS的基础知识,主要目的是加深对CSS的理解,虽然个人主要工作基本都是后台开发,但是个人觉得系统学习一下CSS的基础还是很有必要的.下面我学习CSS时做的思维导图(全屏 ...
- vue-05-webpack安装-vue单文件启动
1, webpack是什么 1), 是一个打包工具, 比gulp, grunt更先进 2), 额外功能 项目部署上线, 清空目录等 hot module reload, 页面刷新后, 数据不变化 3) ...
- Netty入门简介
前言 Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机 ...
- k8s升级,HA集群1.12.0~HA集群1.13.2
k8s升级,此次升级是1.12.0 至1.13.2 准备 # 首先升级master节点的基础组件kubeadm.kubelet.kubectl apt policy kubeadm 找到相应的版本,如 ...
- spring的第二天
spring的第二天 ssm框架 spring 在昨天简单的介绍了一下spring,那么今天接着继续介绍. spring值的注入 自动装配[autowire] 引用资源 applicationCon ...
- HDU3987(最小割最少割边)
Harry Potter and the Forbidden Forest Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65536/ ...
- 【工具相关】ionic-通过nmp安装最新版本的 cordova 和 ionic
一,命令行下输入: sudo npm install -g cordova ionic 用来安装最新版本的cordova和ionic. 如下图所示: 二,等待一下,如下图所示. 三,用命令 npm u ...
- Power BI 与 Azure Analysis Services 的数据关联:3、还原备份文件到Azure Analysis Services
Power BI 与 Azure Analysis Services 的数据关联:3.还原备份文件到Azure Analysis Services 配置存储设置 备份前,需要为服务器配置存储设置. ...
- Windows下使用Rtools编译R语言包
使用devtools安装github中的R源代码时,经常会出各种错误,索性搜了一下怎么在Windows下直接打包,网上的资料也是参差不齐,以下是自己验证通过的. 一.下载Rtools 下载地址:htt ...