python学习【第九篇】python面向对象编程
一、面向对象了解
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。
面向对象编程
二、类与对象
面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
类的创建:
- 关键字:class
- 创建对象:类名称后面加()
# 创建类
class Role(object):
def __init__(self): # 构造方法,见下文讲解
pass
def show(self): # 类中函数的第一个参数必须是self,见下文讲解
"""
:return:
"""
print("this is a role object")
r1 = Role() # 创建对象
r1.show()
类就是一个模板,模板中可以包含很多的函数
三、面向对象三大特性
面向对象三大特性:封装、继承、多态
一、封装
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
实现封装的步骤:
- 将内容封装到某处
- 从某处调用被封装的内容
- 通过对象调用被封装的内容
- 通过self间接调用被封装的内容
def __init__(self, name, age): # 构造函数,有name和age两个属性
self.name = name
self.age = age
def show(self):
"""
展示信息
:return:
"""
print(self.name, self.age, sep=":") # 通过self间接调用被封装的属性值
def talk(self, info):
"""
说话
:param info: 内容
:return:
"""
print(info)
p = People("小红", 18) # 创建对象,将值封装到name和age属性中
print(p.age) # 通过对象调用属性值
p.show() # python会默认将p传给self,即self.name ==> p.name,self.age==>p.age,即self代表的是类的实例即当前对象的地址
对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容
对象的私有属性和私有方法
- 私有属性 就是 对象 不希望公开的 属性
- 私有方法 就是 对象 不希望公开的 方法
定义方式:
- 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法
class Women(object):
def __init__(self, name):
self.name = name
self.__age = 18
def __secret(self):
print("%s 的年龄是:%d" % (self.name, self.__age))
w1 = Women("小芳")
w1.secret() # 私有方法不能直接方法
print(w1.age) # 私有属性不能直接访问
python中没有真正意义上的私有:
- 在给 属性、方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问到
- 处理方式:在 名称 前面加上
_类名=>_类名__名称
class Women(object):
def __init__(self, name):
self.name = name
self.__age = 18
def __secret(self):
print("%s 的年龄是:%d" % (self.name, self.__age))
w1 = Women("小芳")
w1._Women__secret()
print(w1._Women__age)
可以通过以上方式访问私有属性和私有访问,不推荐使用
二、继承
继承:可以实现代码的重用,相同的代码不需要重复编写
继承的概念:子类拥有父类的所有方法和属性

继承的语法:
class 类名(父类名):
pass
class Animal(object):
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print("吃。。。%s, %d" % (self.name, self.age))
def drink(self):
print("喝。。。")
def run(self):
print("执行")
def __play(self):
print("玩。。。")
class Dog(Animal):
def __init__(self, name, age):
super().__init__(name, age)
def eat(self):
super().eat() # Python3的使用父类方法的语法
# Animal.eat(self) # python2的语法,python3依然支持,但不建议使用
print("hahaha")
d = Dog("小狗", 12)
d.eat()
d.play() # 父类中私有属性和私有方法,子类不能继承
多继承
多继承语法:
class 子类名(父类名1, 父类名2...)
pass
如果父类之间存在通过的方法时,建议不要使用多继承
Python 中的 MRO —— 方法搜索顺序:
用来查看方法的搜索顺序,主要用于多继承时判断方法、属性的调用路径:
print(Dog.__mro__) # 执行结果 <class '__main__.Dog'>, <class '__main__.Animal'>, <class 'object'>
- 在搜索方法时,是按照
__mro__的输出结果 从左至右 的顺序查找的 - 如果在当前类中 找到方法,就直接执行,不再搜索
- 如果 没有找到,就查找下一个类 中是否有对应的方法,如果找到,就直接执行,不再搜索
- 如果找到最后一个类,还没有找到方法,程序报错
三、多态
多态 不同的 子类对象 调用相同的 父类方法,产生不同的执行结果
- 多态 可以 增加代码的灵活度
- 以 继承 和 重写父类方法 为前提
- 是调用方法的技巧,不会影响到类的内部设计
class Dog(object):
def __init__(self, name):
self.name = name
def game(self):
print("%s 娱乐的玩耍...." % self.name)
class XiaoTianDog(Dog):
def __init__(self, name):
super().__init__(name)
def game(self):
print("%s 飞到天上玩" % self.name)
class Person(object):
def __init__(self, name):
self.name = name
def game_with_dog(self, dog):
print("%s 和 %s 快乐的玩耍" % (self.name, dog.name))
# 让狗玩耍
dog.game() # 传入不同的子类对象,产生的执行结果不同
d1 = Dog("小花")
d2 = XiaoTianDog("小白")
xiaoming = Person("小明")
xiaoming.game_with_dog(d1)
xiaoming.game_with_dog(d2)
多态更容易写出通用的代码,做出通用的编程,以适应变化的需求
四、类属性、静态方法、类方法
在python程序中,类是一个特殊的对象---类对象,类对象有自己的属性和方法,类属性和类方法,通过类名.的方式可以访问类属性和类方法。

类方法:可以在类中通过@classmethod对方法进行修饰
静态方法:可以在类中通过@staticmethod对方法进行修饰
class Game(object):
# 游戏最高分,类属性
top_score = 0
@staticmethod # 静态方法
def show_help():
print("帮助信息:让僵尸走进房间")
@classmethod # 类方法
def show_top_score(cls):
print("游戏最高分是 %d" % cls.top_score)
def __init__(self, player_name):
self.player_name = player_name
def start_game(self):
print("[%s] 开始游戏..." % self.player_name)
# 使用类名.修改历史最高分
Game.top_score = 999
# 1. 查看游戏帮助
Game.show_help()
# 2. 查看游戏最高分
Game.show_top_score()
# 3. 创建游戏对象,开始游戏
game = Game("小明")
game.start_game()
# 4. 游戏结束,查看游戏最高分
Game.show_top_score()
1.实例方法:方法内部可以访问实例属性
实例方法内部可以使用类名.访问类属性 (不推荐使用)
2.类方法:方法内部只需要访问类属性
3.静态方法:方法内部,不需要访问实例属性和类属性
python学习【第九篇】python面向对象编程的更多相关文章
- Python学习-第三天-面向对象编程基础
Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...
- python学习第九讲,python中的数据类型,字符串的使用与介绍
目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...
- python学习笔记15(面向对象编程)
虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界 ...
- Python学习札记(三十) 面向对象编程 Object Oriented Program 1
参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...
- Python学习之路——类-面向对象编程
类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...
- Python学习第九篇——while和for的区别
pets = ['dog','cat','dog','goldfish','cat','rabbit','cat'] print(pets) for pet in pets: print(pet) # ...
- Python 学习 第九篇:模块
模块是把程序代码和数据封装的Python文件,也就是说,每一个以扩展名py结尾的Python源代码文件都是一个模块.每一个模块文件就是一个独立的命名空间,用于封装顶层变量名:在一个模块文件的顶层定义的 ...
- Python学习笔记四:面向对象编程
一:定义类并创建实例 Python中定义类,通过class关键字,类名开头大写,参数列表为所继承的父类.如果没有需要明确继承的类,则继承object. 使用类来创建对象,只需 类名+() 形式即可,p ...
- Python学习札记(四十) 面向对象编程 Object Oriented Program 11
参考:使用元类 NOTE: type() 1.type()函数可以用于检查一个类或者变量的类型. #!/usr/bin/env python3 class Myclass(object): " ...
- Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property
参考:@property NOTE 1.在绑定参数时,为了避免对属性不符合逻辑的操作,需要对传入的参数进行审核. #!/usr/bin/env python3 class MyClass(object ...
随机推荐
- Bat 获取本地代码的Svn Revision并保存到变量
echo off & color 0A for /f "usebackq delims=" %%i in (`"svn info Server | findstr ...
- es6模块学习总结
模块功能主要由两个命令构成:export和import. export用于输出对外接口,improt用于输人接口 exprot 可以输出变量,也可以输出函数.类. 输出变量的三种写法 // 写法一ex ...
- unity Chan!下载
http://unity-chan.com/download/datadownload.html
- 修改 Ubuntu 13.04 LAMP 服务器端口号
因为今天想让一台Ubuntu 13.04服务器对外 web 服务的端口号为8000,自己改了一下,但是就是无法访问,端口后依然为 80.所以在网上找了一下修改端口的办法,原来我还少修改了一个文件,这里 ...
- C-printf/sprintf/snprintf中的类型转换详解
源码1 #include <stdio.h> void f1() { double x = -5.5625; printf("%d\n",x); //输出为0,为什么? ...
- Android apktool反编译资源文件为空解决办法(测试天猫、淘宝等apk成功)
1 Exception in thread main brut.androlib.androlibexception multiple resources 解决办法:下载最新的apktool,在goo ...
- redis内存分析(转)
背景 线上经常遇到用户想知道自己 Redis 实例中数据的内存分布情况.为了不影响线上实例的使用,我们一般会采用 bgsave 生成 dump.rdb 文件,再结合 redis-rdb-tools 和 ...
- ORCAD常见DRC错误
一下就是网上整理的: https://blog.csdn.net/weixin_39671078/article/details/85344762 https://wenku.baidu.com/vi ...
- delphi中检测局域网ip能够ping通模块
// 函数PingHost用于ping目标IP是否连通 // uses winsock 在uses中加入 winsock // 用法: if PingHost(edit2.Text) the ...
- Atitit.eclipse comment template注释模板
Atitit.eclipse comment template注释模板 1. Code templet1 1.1. Settpath1 1.2. 设置存储1 1.3. 导出设置1 2. Java d ...