python 基础系列(四) — Python中的面向对象

python基础系列索引

python 基础系列(一) — Python介绍

python 基础系列(二) — Python基本语法

python 基础系列(三) — Python中的变量进阶

python 基础系列(四) — Python中的面向对象

python 基础系列(五) — Python中的继承

python 基础系列(六) — Python的异常及其处理

python 基础系列(七) — Python中的模块

python 基础系列(八) — Python中的文件操作

python 基础系列(九) — Python中的vi – 终端中的编辑器

python 基础系列(十) — Windows CMD命令大全

python 基础系列(十一) — 使用PyCharm远程调试树莓派python代码 — Windows CMD命令大全

如果你对python感兴趣,不妨看一下我的其他文章

  • 面向过程

    • 注重步骤和过程,不注重职责和分工
    • 如果需求复杂代码会变的非常复杂
    • 开发复杂项目,没有固定套路,开发难度很大
  • 面向对象

类和对象

类和对象是面向对象编程的两个核心概念

  • 类是对一群具有相同特征事物的统称,是抽象的 不能直接使用

    • 特征 被称为 属性
    • 行为 被称为 方法

python中的类名

  • 使用大驼峰命名法 如 CapWords
  • 单词与单词之间不使用下划线

对象

  • 1.dir查看内置函数

  • 在python中 对象几乎是无处不在的,我们之前学习的 变量、数据、函数 都是对象

python中验证对象有两种方式

  • 1.在 标识符/数据 后输入一个 . 按下 TAB 键,ipython 会提示该对象能够调用的 方法列表

  • 2.使用内置函数 dir 出入标识符/数据 , 可以查看对象内的所有属性及方法

属性:

序号 方法名 类型 作用
01 new 方法 创建对象时,会自动调用
02 init 方法 对象被初始化时,会自动调用
03 del 方法 对象被从内存中销毁前,会被自动调用
04 str 方法 返回对象的描述信息,print函数输出使用

以后的学习可以使用dir() 函数,查看对象的方法

1.python中类的定义

python 中的类符合以下的语法格式

Class 类名:def 方法1(self,参数列表):passdef 方法2(self,参数列表):pass
  • 方法 的定义格式和之前的函数 几乎一样
  • 区别在于第一个参数必须是 self

注意: 类名 的命名规则 要符合 大驼峰命名规则

创建对象

  • 当一个类定义完成之后,要使用这个类来创建对象,语法如下:

      对象变量  = 类名()
    

示例代码

class Cat:def eat(self):print("小猫爱吃鱼")def drink(self):print("小猫爱喝水")# 创建小猫对象
cat = Cat()
cat.eat()
cat.drink()

运行结果

小猫爱吃鱼
小猫爱喝水

方法中的 self 参数

可以使用 对象.变量名 = 变量值得方式来增加变量并赋值

  • 注意:这种方式虽然简单但是并不推荐

示例代码:

class Cat:def eat(self):print("小猫爱吃鱼")def drink(self):print("小猫爱喝水")# 创建小猫对象
cat = Cat()cat.name="猫主子"
cat.eat()
cat.drink()
print(cat.name)

执行结果

小猫爱吃鱼
小猫爱喝水
猫主子

使用self在方法内部输出每一只猫名字

哪一个对象调用方法,方法内部的 self 就是 哪一个对象的引用

  • 在类封装的方法内部,self 就表示 当前调用方法的对象自己
  • 调用方法时,程序员不需要传递 self 参数
  • 在方法内部
    • 可以通过 self,访问对象的属性
    • 也可以通过 self , 调用其他的对象方法

于是代码如下

class Cat:def eat(self):print("%s 爱吃鱼" % self.name)def drink(self):print("%s 爱喝水" % self.name)# 创建小猫对象
cat = Cat()cat.name = "猫主子"
cat.eat()
cat.drink()
print(cat.name)# 创建小猫对象
Tom = Cat()Tom.name = "Tom"
Tom.eat()
Tom.drink()
print(cat.name)

示例代码

猫主子 爱吃鱼
猫主子 爱喝水
猫主子
Tom 爱吃鱼
Tom 爱喝水
猫主子

注意使用对象.变量名的方式为对象添加属性的方式虽然方便,但是如果函数内部使用时没有提前添加属性,程序将会报错,而且不容易排查,慎重使用

python中的初始化方法

当我们使用 类名() 创建对象时,python 解释器会自动为我们做两件事情

  • 1.为对象在内存中分配空间 – 创建对象
  • 2.为对象的属性设置初始值 – 初始化方法(init)

这个初始化方法,就是 init 方法 ,是对象的内置方法

init 方法是专门,用来定可以那个类 具有哪些属性的方法

代码示例

class Cat:
"""这是一个猫类"""def eat(self):print("%s 爱吃鱼" % self.name)def drink(self):print("%s 爱喝水" % self.name)def __init__(self):print("这是一个初始化方法")self.name = "猫主子"# 创建小猫对象
cat = Cat()cat.eat()
cat.drink()
print(cat.name)

运行结果

这是一个初始化方法
猫主子 爱吃鱼
猫主子 爱喝水
猫主子

方法的有惨构造方法

开发中希望创建对象的同时就给对象设置属性,可以对 __init__ 方法进行改造

  • 1.把希望设置的属性值,定义成 __init__方法的参数,如果期望有默认值可以赋值默认值
  • 2.在方法内部使用 self.变量名 = 形参 接收外部传递的参数
  • 3.在创建对象时,使用 类名(形参1,形参2...) 的形式调用

代码示例

class Cat:"""这是一个猫类"""def eat(self):print("%s 爱吃鱼" % self.name)def drink(self):print("%s 爱喝水" % self.name)def __init__(self, new_name="小猫"):print("这是一个初始化方法")self.name = new_name# 创建小猫对象
cat = Cat("大脸猫")cat.eat()
cat.drink()
print(cat.name)

运行结果

这是一个初始化方法
大脸猫 爱吃鱼
大脸猫 爱喝水
大脸猫

del 方法

  • 在python中

    • 当使用 类名() 创建对象时,为对象分配空间后,自动调用 __init__方法
    • 当一个对象从内存中销毁前,会自动调用 __del__方法
  • 应用场景

    • 1.__init__ 改造初始化方法可以让创建对象更加灵活
    • 2.__del__ 如果希望在对象被销毁前做一些事,可以考虑使用 __del__方法
  • 生命周期

    • 一个对象从调用 类名()创建,生命周期开始,并调用 __init__方法
    • 一个对象的 __del__方法 ,一旦被调用,生命周期结束
    • 在对象的生命周期内,可以访问对象的属性或者调用对象的方法

面向对象编程

示例

有一个房间类,房间户型,有建筑面积和室内可用面积,有家具 ,家具有自己的名称和占地面积,占地面积不可以多于房子的身剩余面积

class Furniture:def __init__(self, name, area):self.furnitureName = nameself.furnitureArea = areadef __str__(self):return "%s 占地 %.2f 平方米" % (self.furnitureName, self.furnitureArea)class House:def __init__(self, house_type, area):self.house_type = house_typeself.area = areaself.free_area = areaself.furniture_list = []def __str__(self):list = []for item in self.furniture_list:list.append(item.furnitureName)return "户型 %s  ,面积 %.2f【剩余%.2f】,\n家具 %s" % (self.house_type, self.area, self.free_area, list)def add_furture(self, furture):if furture.furnitureArea > self.free_area:print("%s 占用面积过大无法添加" % furture.furnitureName)returnself.furniture_list.append(furture)self.free_area -= furture.furnitureAreaprint("家具 %s 添加成功" % furture.furnitureName)# 1.创建家具
bed = Furniture("席梦思", 60.20)
chest = Furniture("厨房", 30.10)
table = Furniture("餐桌", 45.5)# 2.创建房子对象
my_house = House("三室一厅", 120.20)
my_house.add_furture(bed)
my_house.add_furture(chest)
my_house.add_furture(table)
print(my_house.__str__())

运行结果

家具 席梦思 添加成功
家具 厨房 添加成功
餐桌 占用面积过大无法添加
户型 三室一厅  ,面积 120.20【剩余29.90】,
家具 ['席梦思', '厨房']

在代码中如果对象的属性不知道赋值什么类型可以使用 变量=None

  • None 关键字表示什么都没有
  • 表示一个对象没有方法和属性或者一个变量没有类型
  • 可以将 None 赋值给任何变量

代码示例

class Gun:def __init__(self, model):# 抢的类型self.moudle = model# 子弹数self.bullet_count = 0def add_bullet(self, bullet_count):self.bullet_count += bullet_countdef shoot(self):if self.bullet_count <= 0:print("[%s] 没有子弹了" % self.moudle)self.bullet_count -= 1# 声音特效制作print("[%s] 突突突.... 子弹剩余 %8d" % (self.moudle, self.bullet_count))class Soldier:def __init__(self, name):self.name = nameself.gun = Nonedef add_Gun(self, gun):self.gun = gundef fire(self):if self.gun==None:print("[%s] 还没有枪...")return# 喊口号print("冲啊 [%s]" % self.name)# 让枪装填子弹if self.gun.bullet_count==0:self.gun.add_bullet(50)#  开火self.gun.shoot()xusanduo = Soldier("许三多")
xusanduo.add_Gun(Gun("Ak47"))
xusanduo.fire()
xusanduo.fire()
xusanduo.fire()
xusanduo.fire()

运行结果

冲啊 [许三多]
[Ak47] 突突突.... 子弹剩余       49
冲啊 [许三多]
[Ak47] 突突突.... 子弹剩余       48
冲啊 [许三多]
[Ak47] 突突突.... 子弹剩余       47
冲啊 [许三多]
[Ak47] 突突突.... 子弹剩余       46

总结:

  • 封装是面向对象的编程的一大特点
  • 面向对象的第一步就是讲属性和方法封装到一个类中
  • 外界使用类创建对象,然后让对象调用方法
  • 类的实现细节应该封装在类的内部,外界无需直到实现的具体,只需要通过接口进行调用

python中的身份身份运算符

身份运算符用于比较两个对象的 地址 是否一致,是否是同一个对象的引用

  • 在python中 针对 None 比较时 , 建议使用 is 判断
运算符 描述 实例
is is 是判断两个标识符是不是引用同一个对象 x is y ,类似 id(x) == id(y)
is not is not是判断两个标识符是不是引用不同对象 x is not y ,类似 id(x) != id(y)
  • is与 == 的区别
  • is 用于判断 两个变量引用的对象是不是同一个
  • == 用于判断 引变量的值 是否相等

代码示例

a = [1, 2, 3]
b = [1, 2, 3]print("a is b %s" % (a is b))
print("a == b %s" % (a == b))

运行结果

a is b False
a == b True

私有属性和私有方法

  • 私有属性 就是 对象不希望公开的属性
  • 私有方法 就是 对象不希望公开的方法

在定义属性和方法时,在 属性 或者 方法 的前面增加两个下划线,定义的就是私有方法或者属性

代码示例

class Women:def __init__(self, name):self.name = name# 变量的前面添加两个下划线,定义的属性为私有属性self.__age = 18# 在类的内部,是可以访问对象的私有属性的def secret(self):print("%s 的年龄是 %d"% (self.name,self.__age))xiaohong = Women("小红")
xiaohong.secret()
# 类的外部是不可以直接访问私有类的属性的
print("%s 的年龄是 %d" % (xiaohong.name, xiaohong.__age))

运行代码

小红 的年龄是 18File "E:/学习和总结/groovyStudy/python实战代码/newcode/venv/Include/soldiers_raided.py", line 61, in <module>
print("%s 的年龄是 %d" % (xiaohong.name, xiaohong.__age))
AttributeError: 'Women' object has no attribute '__age'

伪私有属性和伪私有方法的访问

  • 在python中是没有真正意义上的私有实行和私有方法的,我们依旧,可以通过 _类名_变量名 或者 _类名_方法名 的方式进行访问的

  • 在给 属性、方法 命名时,实际上是对名称做了特殊处理,使得外界无法访问

  • 处理方式 在名称前面加上 _类名 得到 _类名_变量名

代码示例

class Women:def __init__(self, name):self.name = nameself.__age = 18def secret(self):print("%s 的年龄是 %d" % (self.name, self.__age))def __printName(self):print(self.name)xiaohong = Women("小红")
xiaohong.secret()
print("%s 的年龄是 %d" % (xiaohong.name, xiaohong._Women__age))
xiaohong._Women__printName()

运行结果

小红 的年龄是 18
小红 的年龄是 18
小红

python 基础系列(四) — Python中的面向对象相关推荐

  1. python基础系列教程——python面向对象编程全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python面向对象编程全解. 面向对象技术简介 一个类占有一个独立的空间,类中的属性叫做类变量,类中的函数,叫做类的方法. 类(Class) ...

  2. python基础系列教程——Python的安装与测试:python解释器、PyDev编辑器、pycharm编译器

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:陈玓玏) python教程全解 白手起家,从头开启python的 ...

  3. python基础系列教程——python基础语法全解

    点击此处​​​​​​​ python教程全解 了解python 1.  了解Python Python是一种解释型(这意味着开发过程中没有了编译这个环节).面向对象(支持面向对象的风格或代码封装在对象 ...

  4. python基础系列教程——python中的字符串和正则表达式全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 转义字符 正则表达式是建立在字符串的基础上,当需要在字符中使用特殊字符时,python用反斜杠\转义字符.如下表: 转义字符 描述\(在行尾时 ...

  5. python基础系列教程——Python中的编码问题,中文乱码问题

    全栈工程师开发手册 (作者:陈玓玏) python教程全解 如果不声明编码,则中文会报错,即使是注释也会报错.只要写中文,必须加一句:# -- coding:utf-8 --.原因:答案在PEP-02 ...

  6. python基础系列教程——python所有包库的下载

    下载地址:https://pypi.python.org/pypi?%3Aaction=browse 支持搜索 Index by date: multidict pymatgen moderngl j ...

  7. python 基础系列(十) — Windows CMD命令大全

    python 基础系列(十) - Windows CMD命令大全 python基础系列索引 python 基础系列(一) - Python介绍 python 基础系列(二) - Python基本语法 ...

  8. python 基础系列(二) — Python基本语法

    python 基础系列(二) - Python基本语法 python基础系列索引 python 基础系列(一) - Python介绍 python 基础系列(二) - Python基本语法 pytho ...

  9. Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习

    Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习 目录 Python 基础 之 jupyter notebook 中机器学习的简单入门书写 ...

  10. Python基础系列N讲 | 1500字详解Anaconda安装教程(附安装包)

    持续分享Excel.MySQL.Python领域干货.戳公众号链接[数据分析与统计学之美],关注这个有一点点东西的公众号.还可获取四个原创文档<Python自动化办公手册>.<Exc ...

最新文章

  1. 雷电2接口_地表最强?代替电脑的所有接口,雷电3或有望一统接口江湖
  2. dataframe 筛选_使用pandas筛选出指定列值所对应的行
  3. Android中的基础控件CheckBox、RadioButton、ToggleButton、SeekBar
  4. Spring IO Platform简介及示例
  5. [云炬创业管理笔记]第三章打造优秀创业团队讨论3
  6. 复现经典:《统计学习方法》第 12 章 监督学习方法总结
  7. Marketing Cloud launchpad中的meta标签
  8. sqlserver 存储过程 C#调用 实现从数据库Get数据
  9. shell编程题(四)
  10. Web前端文档阅读笔记-vis.js动态添加节点(vue cli环境)
  11. MATLAB中神经网络train函数使用说明
  12. 直流电机PID调节——P
  13. 合宙800 cgnsinf 只回复ok_中奖了吗?老夫妻突然被告知账户多了800多万元!记者去调查,钱又没了!|汉口银行|民政局|低保|周师傅...
  14. 约瑟夫环问题 poj 1012 poj 2244
  15. CV学习笔记-BP神经网络代码Python实例
  16. 4刀最多切割一个正方体为多少块
  17. 不用命令行WinRAR解压7z.001格式的文件
  18. [1.24] T3-人品问题
  19. 云计算技术 — 分布式云
  20. 键盘事件和keycode对照表

热门文章

  1. 小米平板可以编程c语言吗,小米平板方便使用吗
  2. 三轴加速度传感器角度值转换原理
  3. 35枚不同风格的设计师个人网站欣赏
  4. Jeff Dean 光辉事迹
  5. 关于本博客博皮的几点改进与释疑
  6. ILI9431的LCD屏使用,STM32F1控制
  7. oracle删除目录 数据库文件,数据库生成一个app文件夹为什么删不掉
  8. matlab指数e是如何表示,Matlab中表达e怎么操作?表达e方法详解
  9. idea中项目文件颜色含义
  10. Latex:大于等于号和小于等于号