python学习【第九篇】python面向对象编程
2018-06-18 03:00:24来源:未知 阅读 ()
一、面向对象了解
面向对象编程——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.静态方法:方法内部,不需要访问实例属性和类属性
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
