Python学习之面向对象编程
Python学习目录
- 在Mac下使用Python3
- Python学习之数据类型
- Python学习之函数
- Python学习之高级特性
- Python学习之函数式编程
- Python学习之模块
- Python学习之面向对象编程
- Python学习之面向对象高级编程
- Python学习之错误调试和测试
- Python学习之IO编程
- Python学习之进程和线程
- Python学习之正则
- Python学习之常用模块
- Python学习之网络编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
类和实例
定义
class Student(object):passstone = Student()
stone.name = "stone"
stone.age = 2print(stone.name, stone.age)
复制代码
上面代码中:
- class后面紧接的是类名,类名以大写字母开头
- (object)是该类从哪个类继承下来的
- 使用时候可以自由的给实例变量绑定属性
方法
class Student(object):def __init__(self, name, age):self.name = nameself.age = agedef print_info(self):print(self.name, self.age)stone = Student("stone", 18)
stone.print_info()
复制代码
上面代码中:
__init__
方法的第一个参数永远是self
,表示创建的实例本身,因此,在__init__
方法内部,就可以把各种属性绑定到self
,因为self
就指向创建的实例本身。类似于java的构造函数。- 定义一个方法,除了第一个参数是
self
外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self
不用传递,其他参数正常传入。
访问限制
- 实例的变量名如果以
__
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。 - 变量名类似
__xxx__
的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量。
继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。和java一样。
静态语言 vs 动态语言:
对于静态语言(例如Java)来说,如果需要传入Animal
类型,则传入的对象必须是Animal
类型或者它的子类,否则,将无法调用Animal
中的方法。对于Python这样的动态语言来说,则不一定需要传入Animal
类型。我们只需要保证传入的对象有Animal
中的方法就可以了。
对象信息
使用type()
>>> import types
>>> def fn():
... pass
...
>>> type(fn)==types.FunctionType
True
>>> type(abs)==types.BuiltinFunctionType
True
>>> type(lambda x: x)==types.LambdaType
True
>>> type((x for x in range(10)))==types.GeneratorType
True
复制代码
以上代码可以看出,判断基本数据类型可以直接写
int
,str
等,但如果要判断一个对象是否是函数怎么办?可以使用types
模块中定义的常量。
使用isinstance()
>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
Tru
复制代码
可以判断一个变量是否是某些类型中的一种,比如上面的代码就可以判断是否是list或者tuple
使用dir()
如果要获得一个对象的所有属性和方法,可以使用dir()
函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
复制代码
类似__xxx__
的属性和方法在Python中都是有特殊用途的,比如__len__
方法返回长度。在Python中,如果你调用len()
函数试图获取一个对象的长度,实际上,在len()
函数内部,它自动去调用该对象的__len__()
方法,所以,下面的代码是等价的:
>>> len('ABC')
3
>>> 'ABC'.__len__()
3
复制代码
我们自己写的类,如果也想用len(myObj)
的话,就自己写一个__len__()
方法:
>>> class MyDog(object):
... def __len__(self):
... return 100
...
>>> dog = MyDog()
>>> len(dog)
100
复制代码
仅仅把属性和方法列出来是不够的,配合getattr()
、setattr()
以及hasattr()
,我们可以直接操作一个对象的状态:
>>> class MyObject(object):
... def __init__(self):
... self.x = 9
... def power(self):
... return self.x * self.x
...
>>> obj = MyObject()
复制代码
紧接着,可以测试该对象的属性:
>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19
复制代码
也可以获得对象的方法:
>>> hasattr(obj, 'power') # 有属性'power'吗?
True
>>> getattr(obj, 'power') # 获取属性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn() # 调用fn()与调用obj.power()是一样的
81
复制代码
实例属性和类属性
类本身需要绑定一个属性:
class Student(object):name = 'Student'
复制代码
当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。来测试一下:
>>> class Student(object):
... name = 'Student'
...
>>> s = Student() # 创建实例s
>>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
Student
>>> print(Student.name) # 打印类的name属性
Student
>>> s.name = 'Michael' # 给实例绑定name属性
>>> print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael
>>> print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student
>>> del s.name # 如果删除实例的name属性
>>> print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student
复制代码
下一篇:Python学习之面向对象高级编程
Python学习之面向对象编程相关推荐
- 从零开始学习python编程-从0开始的Python学习014面向对象编程(推荐)
简介 到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程.还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程. 类和对象是面向对象编 ...
- Python学习之==面向对象编程(一)
一.面向对象与面向过程 面向对象与面向过程是两种不同的编程范式,范式指的是按照什么方式去编程.去实现一个功能.不同的编程范式本质上代表对各种不同类型的任务采取不同的解决问题的思路. 1.面向过程编程 ...
- python学习之面向对象编程--搬家具
代码展示: class Furniture():def __init__(self, name, area):self.name = nameself.area = areaclass Home(): ...
- Python学习之面向对象高级编程
Python学习目录 1. 在Mac下使用Python3 2. Python学习之数据类型 3. Python学习之函数 4. Python学习之高级特性 5. Python学习之函数式编程 6. P ...
- Python类及面向对象编程【转】
Python类及面向对象编程 类是用来创建数据结构和新类型对象的主要机制.本章的主题就是类,面向对象编程和设计不是本章的重点.本章假定你具有数据结构的背景知识及一定的面向对象的编程经验(其它面向对象的 ...
- python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?
现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...
- python基础之面向对象编程
python基础之面向对象编程 面向对象编程思想 面向对象是一门编程思想,编程思想仅仅是一门思想,与任何技术无关 核心是对象两字,对象可以理解为特征与技能的结合体 基于该编程思想编写程序,就好比创造世 ...
- python如何初始化对象数组_如何理解Python中的面向对象编程?
(由Python大本营付费下载自视觉中国) 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 现如今面向对象编程的使用非常广泛,本文 ...
- 如何理解 Python 中的面向对象编程?
现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews ...
最新文章
- 在Linux的Eclipse下搭建Android环境
- jQuery获取或设置元素的宽度和高度
- 一位 83 岁独立开发者教会我的道理
- 10 分钟上手 Vim,常用命令大盘点
- 关于通过dll导出类模板和函数模板
- 【数据仓库】OLTP系统和OLAP系统区别
- Java图形界面设计——substance皮肤
- 基于神念TGAM的脑波小车(1)
- python常用数据结构及算法_常用数据结构和算法汇总
- 如何判断 linux内核 中 如何判断 条件编译
- Verilog初级教程(13)Verilog中的块语句
- 十五道Python小案例,学会这些,Python基础已过关!
- 【前端知识梳理】HTML篇 笔记整理(一)
- 管理者必须要精通的六项管理技能
- 小爱同学app安卓版_小爱同学app-小爱同学安卓版下载v3.0
- 谢孟媛初级文法28 课地方副词时间副词和程度副词
- 刷题笔记 | 朋友圈、岛屿的最大面积、岛屿数量
- Navicat Premium 15导入excel表格
- 08s01 mysql_mysql报错 code:08S01,msg:SQLSTATE
- 微信小程序,使用canvas画图生成海报并保存手机相册
热门文章
- snmpwalk用法
- .Net Discovery 系列之九--string从入门到精通(勘误版下)
- linux 解压war到root_部署War包到Tomcat根目录位置(Ubuntu/CentOS)
- ios 苹果审核常见被拒问题
- pip 安装依赖库版本低问题
- java 短路判断_随笔 | 奇淫技巧 | Java:记 return 和短路运算符的妙用
- socket什么意思_浅析Redis为什么这么快
- io多路复用的原理和实现_彻底理解 IO 多路复用实现机制
- lol12月25服务器维护,lol12月10日维护到几点 英雄联盟12月10日10.25版本更新维护时间...
- iOS移除父控件中所有子控件的两种方式