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 ...
随机推荐
- msSQL使用表参数
使用表参数 表变量(Table Parameters)可以将整个表数据汇集成一个参数传递给存储过程或SQL语句.它的注意性能开销是将数据汇集成参数(O(数据量)). 定义了一个表参数jk_users_ ...
- Python 类的特殊成员方法详解
class doges(object): """类的描述信息""" def __init__(self,name,food): self.n ...
- B10:迭代器模式 Iterator
提供了一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 适用场景:当你需要访问一个聚合对象,而这个对象不论是什么,你都需要遍历的时候,就用迭代器. UML: 示例代码: class ...
- B2:观察者模式 Observer
定义了一种一对多的依赖关系,多个观察者对象同时监听某一主题的变化,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们可以更新自己. 应用场景:某个实例的变化影响到了其他对象. UML: 示例代 ...
- HTML 5 中WebStorage实现数据本地存储
webstorage 分sessionStorage和localstorage,sessionStorage是暂时保存,localStorage是永久保存. sessionStorage假设浏览器关闭 ...
- RAID详解[RAID0/RAID1/RAID10/RAID5] (转)
一.RAID定义RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘 ...
- Python基础--人们一些最爱的标准库(random time)
Python继续! random 包括返回随机数的函数. 这里跟C++一样,产生的是伪随机数,并非全然随机数. random中一些重要的函数: random() 返回0<n<=1的随机数n ...
- IOS下拉放大图片
代码地址如下:http://www.demodashi.com/demo/11623.html 一.实现效果图 现在越来越多的APP中存在下拉放大图片的效果,今天贡献一下我的实现这种方法的原理,和我遇 ...
- Android源代码解析之(四)-->HandlerThread
转载请标明出处:一片枫叶的专栏 上一篇文章中我们解说了AsyncTast的基本使用以及实现原理,我们知道AsyncTask内部是通过线程池和Handler实现的.通过对线程池和handler的封装实现 ...
- STM32 通用T2、T3、T4、T5定时器详解
定时器初始化配置 void TIM3_Configuration(void)//1MS { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeI ...