以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 面向对象(一)相关推荐

  1. python菜鸟基础教程-Python3 面向对象

    Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...

  2. python 菜鸟-Python3 面向对象

    Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...

  3. python3面向对象_Python3面向对象编程

    Python3面向对象编程 编辑 锁定 讨论 上传视频 <Python3面向对象编程>是2015年6月电子工业出版社出版的图书,作者是肖鹏,常贺,石琳. 书    名 Python3面向对 ...

  4. Python3 面向对象编程

    好记性不如烂笔头,对之前阅读书籍进行梳理与总结,此文为<Python3面向对象编程>阅读笔记. 文章目录 第一章 面向对象设计 第二章 Python对象 第三章 对象相似时 第四章 异常捕 ...

  5. python3面向对象学习

    python3面向对象学习 面向对象 面向对象技术简介 类定义 类对象 self代表类的实例,而非类 类的方法 继承 多继承 方法重写 类属性与方法 类的私有属性 类的方法 类的私有方法 运算符重载 ...

  6. python3 面向对象编程 下载_Python3(7) Python 面向对象编程

    面向对象与面向过程的比较 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...

  7. Python3面向对象编程的三大特性 封装、继承、多态

    1.封装 封装:将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现,外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程序在使用某一对象时不需 ...

  8. python3面向对象(1)

    1.定义类,实例化对象: class Nanny(object): #class 定义一个类名Nanny,这个类继承了objectdef __init__(self,name,age): #__ini ...

  9. python3 面向对象编程_Python3基础-面向对象编程

    类的定义与实例化 语法格式如下: classClassName:. . . 类:用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 对象: 通过类定 ...

  10. python云计算开发技术_云计算开发学习笔记:Python3 面向对象技术简介

    来源:TechWeb.com.cn Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以 ...

最新文章

  1. Yolov4性能分析(下)
  2. Ubuntu系统创建AndroidStudio启动图标(快捷方式)
  3. Mybatis常用查找的总结
  4. linux命令行3d,Linux命令行快捷键
  5. 机器学习中,有哪些特征选择的工程方法?
  6. js前端和后台数据交互-----前端传字符串,后台控制器将其转化为集合
  7. 关于spring mybateis 定义resultType=java.util.HashMap
  8. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - A. 方程整数解
  9. Win10+Ubuntu16.04/Ubuntu18.04双系统安装教程
  10. leetcode 93. 复原IP地址 思考分析
  11. 在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)
  12. Globe宣布将在Balancer拍卖14,000,000枚GDT代币
  13. 博为峰JavaEE技术文章 ——MyBatis Provider之@SelectProvider SQL方法
  14. Some thoughts on dfs
  15. 笔记本上的小键盘计算机怎样用,笔记本小键盘如何关闭和开启 小键盘不能用了怎么办...
  16. 神经网络加速器的兴起
  17. html5辨别音高,音理知识基础:音高和时值
  18. JDK1.8 Collection知识点与代码分析--TreeMap
  19. 涅普2021训练营-MIsc(部分)
  20. 使用Python画小猪佩奇

热门文章

  1. JDK5中的控制台输入
  2. Infragistics NetAdvantage 2006 Volume 2 CLR 2.0曲折安装
  3. 区块链概况:什么是区块链
  4. rails 添加外键_如何在Rails后端中添加功能强大的搜索引擎
  5. jpg在线合并jpg_JPG如何运作
  6. android 请求方式有哪些,Android中的几种网络请求方式详解
  7. 中超赛程来100wan点in_不干了:中超球队改名“硬重启”,球迷组织绝望解散
  8. 1073 Scientific Notation
  9. 软件测试培训需要学习什么技术
  10. 参加软件测试培训需要学什么技术