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 ...
随机推荐
- Managed Media Aggregation using Rtsp and Rtp
his article was written almost 2 years ago, it's content may not reflect the latest state of the cod ...
- 转:【AI每日播报】从TensorFlow到Theano:横向对比七大深度学习框架
http://geek.csdn.net/news/detail/139235 说到近期的深度学习框架,TensorFlow火的不得了,虽说有专家在朋友圈大声呼吁,不能让TensorFlow形成垄断地 ...
- django dispatch
from django.views import View # 这里Home需要继承View class Home(View): # 这样这里就相当于一个装饰器的功能,可以自己定制化内容 def di ...
- unity3D克隆50个游戏对象并输出Json格式的文本
http://wenku.baidu.com/link?url=tl8q_aj1n-U267XkKtSZISaw6jKJ1woh4CJkDUr1AwEzllSAv7P0r7cawXXSyDVXNf6m ...
- TP视图命名规则之一
TP视图命名规则之一 如果觉得目录结构太深,可以通过设置 TMPL_FILE_DEPR 参数来配置简化模板的目录层次,例如设置: 'TMPL_FILE_DEPR'=>'_' 默认的模板文件就 ...
- 【Java】Java_13 分支结构
Java中常见的两种分支结构: <1>If语句:使用布尔表达式或者布尔类型值作为分支条件来进行分支控制. <2>switch语句:对多个整形值进行匹配,从而实现分支控制. 1. ...
- JavaScript 事件循环及异步原理(完全指北)
引言 最近面试被问到,JS 既然是单线程的,为什么可以执行异步操作? 当时脑子蒙了,思维一直被困在 单线程 这个问题上,一直在思考单线程为什么可以额外运行任务,其实在我很早以前写的博客里面有写相关的内 ...
- Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php
Atitit.Cas机制 软件开发 编程语言 无锁机制 java c# php 1. 为什么需要无锁操作1 2. 硬件支持 cas atomic2 3. 无锁编程(Lock-Free)就是在某些应用 ...
- Angularjs学习笔记10_directive3
1. restrict M 使用模板 A 属性扩展 2. template,templateUrl,$templateCache 模板缓存 //注射器加载完所有模块时,此方法执行一 ...
- iOS开发 多屏尺的自动适配(转)
[iOS开发]多屏尺的自动适配 AutoLayout (纯代码方式) (2014-09-19 09:35:47) 转载▼ 标签: autolayout ios开发 xcode ui 分类: Xcode ...