面向对象编程

一、第一个案例---创建类

#__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面向对象编程的更多相关文章

  1. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  2. 图解python | 面向对象编程

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

  3. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  4. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  5. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  6. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  7. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  8. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  9. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  10. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

随机推荐

  1. MyBatis源码解析【8】简单demo理解接口式编程

    前言 这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客 http://www.cnblogs.com/linkstar/category/1027239.html 上一次我们经过源码的 ...

  2. 本地k8s环境minikube搭建过程

    首先要安装docker这个环境是需要自己安装的.相关步骤如下: 1 2 3 4 5 6 7 8 9 10 11 yum install -y yum-utils device-mapper-persi ...

  3. 【杂谈】对IO与NIO的认识

    IO流与NIO块的数据缓存 Java的IO是面向流设计的,通常我们通过IO流读取数据,只能指定读取数据的大小,而不能选择数据读取的起始位置.数据就像流水一样,流过我们的应用,一旦流过就无法回头.除非我 ...

  4. 金山wps面经

    前言: 金山wps笔试是好久之前的了,忘记具体几号了.当时在华师参加的宣讲会,然后线下笔试通过了, 昨天(4月2号通知现场面试).今天是在华工酒店进行面试的,一二面一起进行的 一面: 1: 自我介绍 ...

  5. css中的float属性以及清除方法 (2011-09-03 17:36:26)

    CSS里面的浮动属性是布局的常用工具,只有真正了解它并熟练使用才能将它的优点发挥到极致. 许多页面中都有文字绕图效果,并且各区块分布得错落有置,很多朋友在自学CSS布局时为了做出这些效果往往会被div ...

  6. 《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读

    堆内存使用分析,GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要清除的对象, ...

  7. ef学习一

    学习内容:https://www.cnblogs.com/5ishare/p/5801229.html 注意点: 1.NuGet程序包引入ef,使用DbSet<>必须引入ef.本例EFCo ...

  8. MVC分部视图@Html.Partial

    加载分布视图的方式: //1.以视图名使用当前文件夹下的视图(如果没有找到,则搜索 Shared 文件夹) @Html.Partial("_test") //加载对应文件 /Vie ...

  9. Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析

    目录 引出线程池 Executor框架 ThreadPoolExecutor详解 构造函数 重要的变量 线程池执行流程 任务队列workQueue 任务拒绝策略 线程池的关闭 ThreadPoolEx ...

  10. Java框架之Spring(三)

    本文主要介绍Spring中, 1 Bean 的 init-method 和 destroy-method 2 集合类型的装配 3 注解方式装配 4 以自动扫描把组件纳入spring容器中管理 5 代理 ...