python3 面向对象(一)
以Student类为例,定义类通过 class 关键字
class Student(object):pass
class 后面紧接着是类名,即 Student,类名通常是大写开头的单词,紧接着是 (object),表示该类是从哪个类继承下来的
>>> stu = Student()
>>> stu
<__main__.Student object at 0x10a67a590> >>> Student <class '__main__.Student'>
stu 指向的是Student的object
给 stu 绑定一个 name 属性
>>> stu.name = "Alex"
>>> stu.name
'Alex'
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去:
class Student(object):def __init__(self, name, score): self.name = name self.score = score
__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身
>>> stu = Student('Alex', 59) >>> stu.name 'Alex' >>> stu.score 59
封装
创建实例需要给出name和score,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了
封装的另一个好处是可以给Student类增加新的方法,比如get_grade
class Student(object):...def get_grade(self): if self.score >= 90: return 'A' elif self.score >= 60: return 'B' else: return 'C' >>> stu.get_grade() 'C'
私有属性
__sex代表私有属性,只能在实例的内部各函数(方法)中调用,外部可以通过函数访问,但是不能修改
隐藏一些功能的实现细节,之给外部暴露调用接口
class Student(object):def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print '%s: %s' % (self.__name, self.__score)
改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:
>>> stu = Student('Bart Simpson', 98)
>>> stu.__name Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Student' object has no attribute '__name'
如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:
class Student(object):...def get_name(self): return self.__name def get_score(self): return self.__score
如果又要允许外部代码修改score怎么办?可以给Student类增加set_score方法:
class Student(object):...def set_score(self, score): self.__score = score
继承
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印:
class Animal(object):def run(self): print 'Animal is running...'
当我们需要编写Dog和Cat类时,就可以直接从Animal类继承:
class Dog(Animal):def run(self): print 'Dog is running...' class Cat(Animal): def run(self): print 'Cat is running...'
>>> dog = Dog()
>>> dog.run() >>> cat = Dog() >>> cat.run() Dog is running... Cat is running...
继承还可以一级一级地继承下来,最终都可以追溯到根类A
多态
新增一个Animal的子类,不必对run_twice()做任何修改,实际上,任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态
def run_twice(animal):animal.run()animal.run()
当我们传入Animal的实例时,run_twice()就打印出:
>>> run_twice(Animal())
Animal is running...
Animal is running...
当我们传入Dog的实例时,run_twice()就打印出:
>>> run_twice(Dog())
Dog is running...
Dog is running...
当我们传入Cat的实例时,run_twice()就打印出:
>>> run_twice(Cat())
Cat is running...
Cat is running...
多态的好处就是,当我们需要传入Dog、Cat、Tortoise……时,我们只需要接收Animal类型就可以了,因为Dog、Cat、Tortoise……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思:
对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则
对扩展开放:允许新增Animal子类;
对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。
转载于:https://www.cnblogs.com/xp1005/p/6497103.html
python3 面向对象(一)相关推荐
- python菜鸟基础教程-Python3 面向对象
Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...
- python 菜鸟-Python3 面向对象
Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...
- python3面向对象_Python3面向对象编程
Python3面向对象编程 编辑 锁定 讨论 上传视频 <Python3面向对象编程>是2015年6月电子工业出版社出版的图书,作者是肖鹏,常贺,石琳. 书 名 Python3面向对 ...
- Python3 面向对象编程
好记性不如烂笔头,对之前阅读书籍进行梳理与总结,此文为<Python3面向对象编程>阅读笔记. 文章目录 第一章 面向对象设计 第二章 Python对象 第三章 对象相似时 第四章 异常捕 ...
- python3面向对象学习
python3面向对象学习 面向对象 面向对象技术简介 类定义 类对象 self代表类的实例,而非类 类的方法 继承 多继承 方法重写 类属性与方法 类的私有属性 类的方法 类的私有方法 运算符重载 ...
- python3 面向对象编程 下载_Python3(7) Python 面向对象编程
面向对象与面向过程的比较 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...
- Python3面向对象编程的三大特性 封装、继承、多态
1.封装 封装:将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现,外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程序在使用某一对象时不需 ...
- python3面向对象(1)
1.定义类,实例化对象: class Nanny(object): #class 定义一个类名Nanny,这个类继承了objectdef __init__(self,name,age): #__ini ...
- python3 面向对象编程_Python3基础-面向对象编程
类的定义与实例化 语法格式如下: classClassName:. . . 类:用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 对象: 通过类定 ...
- python云计算开发技术_云计算开发学习笔记:Python3 面向对象技术简介
来源:TechWeb.com.cn Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以 ...
最新文章
- Yolov4性能分析(下)
- Ubuntu系统创建AndroidStudio启动图标(快捷方式)
- Mybatis常用查找的总结
- linux命令行3d,Linux命令行快捷键
- 机器学习中,有哪些特征选择的工程方法?
- js前端和后台数据交互-----前端传字符串,后台控制器将其转化为集合
- 关于spring mybateis 定义resultType=java.util.HashMap
- 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - A. 方程整数解
- Win10+Ubuntu16.04/Ubuntu18.04双系统安装教程
- leetcode 93. 复原IP地址 思考分析
- 在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)
- Globe宣布将在Balancer拍卖14,000,000枚GDT代币
- 博为峰JavaEE技术文章 ——MyBatis Provider之@SelectProvider SQL方法
- Some thoughts on dfs
- 笔记本上的小键盘计算机怎样用,笔记本小键盘如何关闭和开启 小键盘不能用了怎么办...
- 神经网络加速器的兴起
- html5辨别音高,音理知识基础:音高和时值
- JDK1.8 Collection知识点与代码分析--TreeMap
- 涅普2021训练营-MIsc(部分)
- 使用Python画小猪佩奇
热门文章
- JDK5中的控制台输入
- Infragistics NetAdvantage 2006 Volume 2 CLR 2.0曲折安装
- 区块链概况:什么是区块链
- rails 添加外键_如何在Rails后端中添加功能强大的搜索引擎
- jpg在线合并jpg_JPG如何运作
- android 请求方式有哪些,Android中的几种网络请求方式详解
- 中超赛程来100wan点in_不干了:中超球队改名“硬重启”,球迷组织绝望解散
- 1073 Scientific Notation
- 软件测试培训需要学习什么技术
- 参加软件测试培训需要学什么技术