面向对象编程

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

#__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. 利用反射实现DataTable 与 List<T> 转换

    今天上班不太忙,就想着总结一下反射.扩展方法.以及lambda表达式的用法,自己就写了个小DEMO记录一下,希望各位大牛们看到后觉得不对的地方请及时提出.这篇文章中我只说明我的用法,作为一个备忘,基本 ...

  2. Extjs gridPanel可复制配置(转)

    ExtJS默认是禁用了文本复制的功能,实际需求中可能需要能够复制,那么如何解决了,我在网上看到了许多解决办法,绝大部分都是从重写CSS样式或者重写gridView代码入手,我遇到这个问题的时候,我想作 ...

  3. 如何让ajax执行完后再继续往下执行

    $.ajax加上参数async: false, false代表同步请求,true代表异步(默认)

  4. 一篇迟到的gulp文章,代码合并压缩,less编译

    前言 这篇文章本应该在去年17年写的,但因为种种原因没有写,其实主要是因为懒(捂脸).gulp出来的时间已经很早了,16年的时候还很流行,到17年就被webpack 碾压下去了,不过由于本人接触gul ...

  5. Spring @Pathvariable

    先记录下@PathVariable的用法吧: @RequestMapping("/demo/{id}") @ResponseBody public User getUser(@Pa ...

  6. 团队作业4——beta阶段冲刺

    Deadline: 2018-12-16 22:00PM,以博客提交至班级博客时间为准 提交: (a) 项目课堂演示: (b) 1篇冲刺准备+5篇冲刺随笔,: (c) 1篇用户使用用报告: (d) 1 ...

  7. python文件处理b模式

    执行环境:windows+Python3.51.rb模式,从文件中读取内容,得到的是bytes类型 因为我们使用的是b模式,所以在open函数中不能指定编码格式,所以打印出来的格式的二进制的格式,而我 ...

  8. asp.net mvc 碰到 XML 解析错误:找不到根元素 位置

    具体报错信息如下: XML 解析错误:找不到根元素 位置:moz-nullprincipal:{4a1d2b7c-6d07-468e-9df9-2267a0422c93} 行 1,列 1: 网上给出的 ...

  9. Jetbrains软件永久破解

    说明:该破解到期时间为2099年,基本为永久破解! 1.点击右侧链接下载脚本JetbrainsCrack-3.1-release-enc.jar [JetbrainsCrack-release-enc ...

  10. Mybatis逆向工程生成po、mapper接口、mapper.xml

    Mybatis逆向工程生成po.mapper接口.mapper.xml 一.新建一个maven工程 请查看我的另一篇博客:<使用idea创建一个maven工程> 二.引入所需依赖 需要my ...