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 ...
随机推荐
- SVN回到历史版本--转载
svn回到历史的某个版本 在代码的编写过程中,难免有些错误需要修改,或者想从以前的文件进行代码修改,这样就涉及到版本的追踪,如果你以前提交时日志写的非常清楚,那版本追踪回滚起来就事半功倍.得心应手.下 ...
- Hex dump
Hex dump From Wikipedia, the free encyclopedia A hex dump of the 318 byte Wikipedia favicon In ...
- jQuery编程小结
加载jQuery 1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢.点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地址. <script t ...
- 怎样用Google APIs和Google的应用系统进行集成(4)----获得Access Token以通过一些Google APIs的OAuth2认证
在上篇文章中: "怎样用Google APIs和Google的应用系统进行集成(3)----调用发现Google APIs的RESTful的服务"一文中,我们直接用jdk的java ...
- Python CODE——Nonblocking I/O client AND Delaying Server
#!Nonblocking I/O - Chapter 5 -pollclient.py import socket,sys,select port=51423 host='localhost' sp ...
- Java 通过JDBC连接Mysql数据库的方法和实例
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- 通过Jenkins部署java项目
部署java项目-创建私有仓库 Jenkins大多数情况下都是用来部署Java项目,Java项目有一个特点是需要编译和打包的,一般情况下编译和打包都是用maven完成,所以系统环境中需要安装maven ...
- sql 写法注意点
a.CRUD(create,read,update,delete)操作方法写法格式 字段格式要个数据库表字段一致,字母不区分大小写,支持下划线. 例如: screenName or scrEenNam ...
- protobuf 在win10系统如何编译jar包
最近在搞java服务器项目,前段要求用protobuf进行数据传输,以前没搞过,查了很多资料,走了一些弯路! 先把一些需要下载的链接放上来: protobuf下载地址:https://github.c ...
- java - day15 - NonameInner
匿名内部类 public interface Inter {} interface Inter2{ void show(); } main(){ //错误,接口不能实例化 Inter t = new ...