Python的面向对象

一、面向过程与面向对象的对比

面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。

优点是:极大的降低了程序的复杂度

缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。

应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。

面向对象的程序设计的核心是对象,Python中 一切皆对象,上帝思维,在上帝眼中这世间的一切都是对象,没有的东西也能创造出来。

优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。

缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致某个游戏的角色出现数据异常的技能,比如一刀砍死3个人,这样就会很影响游戏的平衡。

应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。

二、类与对象

基于面向对象设计一个款游戏:英雄联盟,每个玩家选一个英雄,每个英雄都有自己的特征和和技能,特征即数据属性,技能即方法属性,特征与技能的结合体就一个对象。

从一组对象中提取相似的部分就是类所有对象都具有的特征和技能的结合体

在python中,用变量表示特征,用函数表示技能,因而类是变量与函数的结合体,对象是变量与方法(指向类的函数)的结合体。

1.类的定义

'''
 
class 类名:

类的文档字符串

类体 

'''

class Student:#class语句与定义函数类似  定义类名

  school = 'oldboy'  #变量  这个类的特征(每个对象的共同特征)
  def __init__(self,name,age):  #初始化函数(各个对象的所独有的特征)
    #只用来初始化的,并且一定不能有返回值,
  self.name=name
  self.age=age
  def study(self):  #函数  这个类的技能(每个对象的共有技能)
    pass

2.类的两种作用:实例化和属性引用

2.1实例化:类名加括号

class Oldboy:  #定义oldboy类
teacher_tyle="python"
def __init__(self,name,age,sex):
if not isinstance(name,str):
raise TypeError
self.name=name
self.age=age
self.sex=sex
def teach(self):
print("teach python")
def talk(self):
print("talk english")
def eat(self):
print("is eating")
name1=Oldboy("egon","18","boy")#实例化,其实就是在执行__init__这个初始化函数将参数传入函数,实例化之后的内容被称为对象。
2.2属性引用:类名加属性
Oldboy.teacher_tyle#引用类的数据属性,该属性与所有的实例(对象)共享。
Oldboy.teach#引用类的函数属性,该属性与所有的对象共享。
2.3对象的只有一个作用:属性引用
name1.name
对象/实例本身只有数据属性,但是python的class机制会将类的函数绑定到对象上,称为对象的方法,或者叫绑定方法,绑定方法唯一绑定一个对象,同一个类的方法绑定到不同的对象上,属于不同的方法,内存地址都不会一样
name1.eat
3.类的名称空间与对象的名称空间。

创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

而类有两种属性:数据属性和函数属性其中类的数据属性是共享给所有对象的

创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性。

name1.name会先从对象自己的名称空间中找name,找不到就去类里面找,类找不到就去它父类中找,还是找不到的话抛出异常报错!

三、类的继承与派生

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

class People:
pass

class Animal:
pass

class Student(People,Animal): #people称为基类或父类
pass
print(Student.__bases__)
print(People.__bases__)
print(Animal.__bases__)
#在python3中,所有类默认继承object,
#但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类)
#没有继承object类的子类成为经典类(在python2中,没有继承object的类,以及它的子类,都是经典类)

解决代码重用的问题,减少代码冗余
继承是一种什么‘是’什么的关系
class People:
def __init__(self, name, age):
# print('People.__init__')
self.name = name
self.age = age
def walk(self):
print('%s is walking' %self.name)

class Teacher(People):
pass

class Student(People):
pass

# t=Teacher('egon',18)
# print(t.name,t.age)
# print(t.__dict__)
# t.walk()

# s=Student('alex',13)
# print(s.name,s.age)
# s.walk()

四、组合

软件重用的重要方式除了继承之外还有另外一种方式,即:组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

组合:是一种什么有什么的关系,也是为了减少重复代码
class People:
def __init__(self, name, age, year, mon, day):
self.name = name
self.age = age
self.birth = Date(year, mon, day)

def walk(self):
print('%s is walking' % self.name)

class Date:
def __init__(self,year,mon,day):
self.year=year
self.mon=mon
self.day=day

def tell_birth(self):
print('出生于<%s>年 <%s>月 <%s>日' % (self.year,self.mon,self.day))

class Teacher(People):
def __init__(self, name, age, year, mon, day,level,salary):
People.__init__(self,name,age,year,mon,day)
self.level=level
self.salary=salary

def teach(self):
print('%s is teaching' %self.name)

class Student(People):
def __init__(self, name, age, year, mon, day,group):
People.__init__(self,name,age,year,mon,day)
self.group=group
def study(self):
print('%s is studying' %self.name)
# t=Teacher('egon',18,1990,2,33)
# print(t.name,t.age)
# print(t.birth)
# t.birth.tell_birth()
# print(t.birth.year)
# print(t.birth.mon)
# print(t.birth.day)

 五、接口

class File:#定义接口Interface类来模仿接口的概念,python中压根就没有interface关键字来定义一个接口。
# def read(self): #定接口函数read
# pass
#
# def write(self): #定义接口函数write
# pass
#
#
# class Txt(File): #文本,具体实现read和write
# def du(self):
# print('文本数据的读取方法')
#
# def xie(self):
# print('文本数据的读取方法')
#
# class Sata(File): #磁盘,具体实现read和write
# def read(self):
# print('硬盘数据的读取方法')
#
# def write(self):
# print('硬盘数据的读取方法')
#
# class Process(File):
# def read(self):
# print('进程数据的读取方法')
#
# def write(self):
# print('进程数据的读取方法')
#
#
# txt=Txt()
# disk=Sata()
# process=Process()
#
#
# txt.du()
# # disk.read()
# # process.read()
#
#

#父类要限制
#1;子类必须要有父类的方法
#2:子类实现的方法必须跟父类的方法的名字一样
import abc

class File(metaclass=abc.ABCMeta):
@abc.abstractmethod
def read(self):
pass

@abc.abstractmethod
def write(self):
pass

class Txt(File): #文本,具体实现read和write
def read(self):
pass
def write(self):
pass
t=Txt()

Python进阶---面向对象的程序设计思想的更多相关文章

  1. python基础——面向对象的程序设计

    python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  2. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

  3. python基础----面向对象的程序设计(五个阶段、对小白的忠告、关于OOP常用术语)、类、对象

    一.面向对象的软件开发有如下几个阶段                                              1.面向对象分析(object oriented analysis ,O ...

  4. python之面向对象的程序设计

    一.什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了程序的复杂度 缺点是: ...

  5. ECMAScript中面向对象的程序设计思想总结

    <JavaScript高级程序设计>Chapter6笔记 1.ECMAScript内部值属性:数据属性和访问器属性 1)数据属性 数据属性的4个特性: configurable:表示能否通 ...

  6. Python 进阶 - 面向对象

    Python 面向对象 面向过程 把完成某个需求的所有步骤,从头到尾逐步实现 根据开发需求,将某些功能独立的代码封装成一个又一个函数 最后完成的代码,就是顺序地调用不同的函数 面向过程特点: 注重步骤 ...

  7. Python进阶(面向对象编程基础)(三)

    6.类属性和实例属性名字冲突怎么办 修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢? class Person(object): address ...

  8. Python进阶(面向对象编程基础)(二)

    1.初始化实例属性 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'ziv·chan' #定义Person类的__init__方法 ...

  9. Python进阶(面向对象编程基础)(一)

    鉴于昨天被类和函数折腾得晕头转向,今特把类的知识翻出来温习. 1.定义类并创建实力对象 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ ...

随机推荐

  1. Linux vi 退出&保存/不保存

    无论是否退出 vi,均可保存所做的工作.按 ESC 键,确定 vi 是否处于命令模式. 操作   键入 保存,但不退出vi                          :w 保存并退出vi    ...

  2. HDU1423 LCIS

    1,先离散化,然后DP: 注意这个解法中,dp[i][j][k]代表a序列中前i个和b序列中前j个数结尾为k或小于k时的最大. 但是由于i是单增(一次1->n),而j反复变化(多次1->m ...

  3. ZOJ2965 Accurately Say "CocaCola"! 线性扫描

    Accurately Say "CocaCola"! 范围找到:1--700左右,然后打表就ok了 #include<cstdio> #include<cstdl ...

  4. jdbc-大数据存储

    jdbc-大数据存储 1 什么是大数据 所谓大数据,就是大的字节数据,或大的字符数据.标准SQL中提供了如下类型来保存大数据类型: 类型 长度 tinyblob 28--1B(256B) blob 2 ...

  5. pb9常见错误及含义

    1. by zero  发生被0除错误 2. Null object reference  空对象引用 3. Array boundary exceeded  数组越界 4. Enumerated v ...

  6. JavaScript实现模糊推荐的input框(类似百度搜索框)

    如何用JS实现一个类似百度搜索框的输入框呢,再填充完失去焦点时,自动填充配置项,最终效果如下图: 实现很简单,但是易用性会上升一大截,需要用到的有jquery-ui的autocomplete,jque ...

  7. IDEA Maven 三层架构 1、基本的Archetype 搭建

    JDK:1.8 Maven:3.3.9 三层架构:基于 SpringMVC 的 UI 层.业务逻辑层以及数据访问层 从对 Maven 的了解可以看出,三层架构的创建在于对文件夹的合理安排,他们通常是主 ...

  8. 【解决方案】客户端请求数据较大时,nginx返回数据被截断

    [问题描述]:客户端使用curl命令向nginx请求数据,当返回数据量较大时,数据被截断,客户端无法获取完整的数据. [问题原因]:nginx配置文件中包含了proxy_buffer_size.pro ...

  9. Nodejs入门-基于Node.js的简单应用

    服务端JavaScript 众所周知的,JavaScript是运行在浏览器的脚本语言,JavaScript通常作为客户端程序设计语言使用,以JavaScript写出的程序常在用户的浏览器上运行.直至N ...

  10. 使用wget做站点镜像及wget的高级用法

    本文为大家介绍 使用wget做站点镜像及wget的高级用法,供大家学习参考. # wget -r -p -np -k http://xxx.edu.cn -r 表示递归下载,会下载所有的链接,不过要注 ...