以上就是本节对于面向对象初级知识的介绍,总结如下:

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用
  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态

面向对象基础

什么是面向对象

面向对象有别于传统的面向过程变成,是对一个具体事物的抽象描述,在用编程中的可以提高程序员的工作效率,

值得一提的是在python里面不想Java等语言强制程序员使用面向对象编程,可以采用面向对象和函数混合的

方式进行.

创建类和对象

下面我们来创建一个最基本的类,这个叫做Foo的类:

class Foo:
def __init__(self, name, favor):
self.name = name # 普通字段
self.favor = favor
def intro(self):
print("%s like eat %s" % (self.name, self.favor)) # 类创建对象时候就传入了参数 到构造方法
bob = Foo("Bob", "apple")
sam = Foo("Sam", "orange") # 执行类方法时候不需要传参数了
bob.intro()
sam.intro()

类名字定义是由class关键字空格加类名字Foo加冒号组成;

这个类里面有两个def开头的像是函数一样的东西,我们叫做它"方法";

这个类里面有一个"__init__"的特殊方法我们叫做它"构造方法";

而另外一个def开头的方法则叫做普通方法;

类的实例化是有一个对象名字加等号类的名字加上一个括号,括号里面是我们需要传入的参数;

类的执行是对象名字加一个点加上类里面的方法加一对括号;

类是对事物的抽象化

对象是类的实例化

  

面向对象三大特征

1.封装

封装就是:我们定义的类必然要生成不同的对象,封装就是封装那些不重复的类都要使用的字段

class Foo:
# 构造方法里面的所有成员叫做普通字段
# 在根据类创建对象的时候自动执行
def __init__(self, name, favor):
self.name = name # 普通字段
self.favor = favor # 根据Foo类创造对象
# 自动执行Foo类的__init__方法
bob = Foo("Bob", "apple")

  

self 是一个形式参数,当执行 bob = Foo("Bob, "apple") 时,self 等于 bob

当执行 sam = Foo("Sam", "orange") 时,self 等于 sam

所以,内容(name/favor)其实被封装到了对象bob 和 sam 中,每个对象中都有 name 和 age 属性.

那么封装的内容我们如何调用呢?

  直接调用:通过 对象.方法调用 

class Foo:
def __init__(self, name, favor):
self.name = name # 普通字段
self.favor = favor bob = Foo("Bob", "apple")
print("%s like eat %s" % (bob.name, bob.favor))

  

  间接调用:通过self间接调用内容

class Foo:
def __init__(self, name, favor):
self.name = name # 普通字段
self.favor = favor def show_detail(self):
print("%s like %s" % (self.name, self.favor)) bob = Foo("Bob", "apple")
bob.show_detail()

  

有一个同学叫小明,他年龄5岁体重90斤,做一次健身体重减轻,吃一次东西会相应增肥:

class Person:
# 构造方法
def __init__(self, name, age, weight):
# 普通字段
self.Name = name
self.Age = age
self.Weight = weight
# 方法
def chidongxi(self):
self.Weight += 2 def jianshen(self):
self.Weight -= 1 p1 = Person('小明', 5, 90) # 实例化出一个类,包含基本信息(姓名/年龄/体重)
p1.jianshen() # 执行健身方法减重
p1.chidongxi() # 执行吃东西方法增肥
p1.chidongxi()
p1.chidongxi()
p1.jianshen()
print(p1.Weight) # 查看最终体重

减肥游戏

2.继承

单一继承

狗和猫都属于动物类,动物都有吃东西喝水的动作,然而狗却是汪汪叫,猫是喵喵叫;所以创建狗和猫两个类之前可以创建一个叫做动物的基类,

让动物拥有吃东西喝水的方法,让狗和猫继承动物的一些基本方法,这样创建其他动物时候就只要创建它们特殊的方法就ok了!

#!/usr/bin/env python
# -*- coding: utf-8 -*- class Animals:
def chi(self):
print(self.name + "吃东西") def he(self):
print(self.name + "喝水") class Dog(Animals):
def __init__(self, name):
self.name = name def jiao(self):
print(self.name + "旺旺叫") class Cat(Animals):
def __init__(self, name):
self.name = name def jiao(self):
print(self.name + "喵喵叫") zhaocai = Dog("招财")
zhaocai.chi()
zhaocai.he()
zhaocai.jiao() xiaomi = Cat("小咪")
xiaomi.jiao()

单一继承

所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

多继承

继承的顺序: 查找自身 ---- 继承类(左边----右边)

经典类/新式类多继承情况下的两种查找顺序:

  • 经典类时,多继承情况下,按照深度优先方式查找
  • 新式类时,多继承情况下,按照广度优先方式查找

 

#!/usr/bin/env python
# -*- coding: utf-8 -*- class God:
def bar(self):
print 'God.bar' class A(God):
def ba(self):
print 'A.bar' class B(God):
def bar(self):
print 'B.bar' class C(A):
def ba(self):
print 'C.bar' class D(B):
def ba(self):
print 'D.bar' class E(C, D):
def ba(self):
print 'E.bar' e = E()
e.bar()

经典类多继承

#!/usr/bin/env python
# -*- coding: utf-8 -*- class God(object):
def bar(self):
print 'God.bar' class A(God):
def ba(self):
print 'A.bar' class B(God):
def bar(self):
print 'B.bar' class C(A):
def ba(self):
print 'C.bar' class D(B):
def ba(self):
print 'D.bar' class E(C, D):
def ba(self):
print 'E.bar' e = E()
e.bar() #B.bar

新式类多继承

总结:

  python2.7未继承object时(经典类),则深度搜索优先(一条道走到黑).

  python2.7继承object(新式类),则广度搜索优先,顶部(指共同继承一个基类)最后.

  python3里面只有新式类,执行广度优先

3.多态

Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

[Python笔记]第十一篇:面向对象的更多相关文章

  1. 【python自动化第十一篇】

    [python自动化第十一篇:] 课程简介 gevent协程 select/poll/epoll/异步IO/事件驱动 RabbitMQ队列 上节课回顾 进程: 进程的诞生时为了处理多任务,资源的隔离, ...

  2. python学习笔记-(十一)面向对象进阶&异常处理

    上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用). 静态方法 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使 ...

  3. [Python笔记]第三篇:深浅拷贝、函数

    本篇主要内容:深浅拷贝,自定义函数,三目运算,lambda表达式, 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import ...

  4. Python笔记_第二篇_面向过程_第二部分_2.路径、栈和队列、内存修改

    这一部分分三个主题进行讲解,主要为后面的模块.包.第三方库的概念补充一些相关的内容. 1. 路径(Path): 相对路径和绝对路径. 举例1:我们先导入一个os库(模块)来观察一下路径 import ...

  5. [Python笔记]第八篇:模块

    本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...

  6. [Python笔记]第六篇:文件处理

    本篇主要内容:open文件处理函数的使用 open函数,该函数用于文件处理 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = open('文件路径', '模式') 打 ...

  7. [Python笔记]第五篇:递归

    本篇主要内容:递归以及冒泡排序 参考文章:(http://www.cnblogs.com/balian/archive/2011/02/11/1951054.html) 递归的概念 递归的概念很简单, ...

  8. [Python笔记]第四篇:内置函数

    本篇主要内容:内置函数 函数 参考:https://docs.python.org/3.5/library/functions.html 内置函数列表 一.数学运算类 abs(x)求绝对值 >& ...

  9. A Byte of Python 笔记(9) 面向对象编程

    第11章  面向对象编程 面向过程:根据操作数据的函数或语句块来设计程序. 面向对象(OOP, object-oriented programming):把数据和功能结合起来,用对象包裹组织程序. 类 ...

随机推荐

  1. cf602A Two Bases

    A. Two Bases time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  2. 迷宫 maze

    1 #include <stdlib.h> #include <stdio.h> #define stackinitsize 50 #define stackincrement ...

  3. sqlserver使用OpenQuery或OPENROWSET遇到的问题

    OpenQuery,OPENROWSET允许用户在链接服务器上查询.通过这种方法来得到查询的结果集.     1.在创建存储过程中,必须设置           SET   ANSI_NULLS   ...

  4. SimpleDateFormat线程不安全问题处理

    在工作中,通过SimpleDateFormat将字符串类型转为日期类型时,发现有时返回的日期类型出错,调用方法如下: public final class DateUtil { static fina ...

  5. WinFrom玩转config配置文件

    本文转载:http://www.dotblogs.com.tw/sam319/archive/2010/01/01/12753.aspx 有時候我們希望程式可以記下使用者的設定    下次開啟時可以繼 ...

  6. 从零单排c++ primer(17)

    (1)假设一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义. (2)派生类的成员将隐藏同名的基类成员. (3)除了覆盖继承而来的虚函数之外,派生类最好不要重用 ...

  7. PHP Predefined Interfaces 预定义接口(转)

    SPL提供了6个迭代器接口: Traversable 遍历接口(检测一个类是否可以使用 foreach 进行遍历的接口) Iterator 迭代器接口(可在内部迭代自己的外部迭代器或类的接口) Ite ...

  8. Linux 开机自检的设置(tune2fs和fsck)

      tune2fs和fsck的用法 tune2fs--调整ext2/ext3文件系统特性的工具. -l <device> 查看文件系统信息 -c <count> 设置强制自检的 ...

  9. 【iOS控制器跳转时,NavigationBar有阴影动画闪过的解决办法】

    如题,push控制器时,由于默认的控制器view是黑色,push到这个控制器时,navigationBar(默认是透明效果)后面有一个黑色阴影一闪而过,解决办法将navigationBar设为图片填充 ...

  10. JSON 遍历转为Model Bean

    @RequestMapping(value = "/batchAddPageIndexBrand") @ResponseBody public HashMap<String, ...