面向过程 面向对象:

面向过程:—侧重于怎么做?
1.把完成某一个需求的 所有步骤 从头到尾 逐步实现
2.根据开发要求,将某些功能独立的代码封装成一个又一个函数
3.最后完成的代码,就是顺序的调用不同的函数
特点:
1.注重步骤和过程,不注重职责分工
2.如果需求复杂,代码变得非常复杂
3.开发复杂的项目的时候,没有固定的套路,开发难度很大
面向对象:----侧重于谁来做?
相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法
1.在完成某一个需求前,首先确定职责–要做的事(方法)
2.根据职责确定不同的对象,在对象内部封装不同的方法(多个)
3.最后完成代码,就是顺序的让不同的对象调用不同的方法
特点:
1.注重对象和职责,不同的对象承担不同的职责
2.更加适合对复杂的需求变化,是专门应对复杂项目的开发,提供固定的套路
3.需要在面向过程的基础上,再学习一些面向对象的语法

面向过程—>侧重于怎么做?
面向对象—>测中于谁来做?

区别与应用场景:
面向过程:复杂的问题流程化,简单化,侧重于怎么做
应用场景:不再需要扩展了,监测脚本,自动部署脚本,软件解压安装

面向对象:特征与技能的结合体 一切皆对象,侧重于谁来做
应用场景:用户需求经常变化,互联网应用,游戏,企业内部应用

面向对象有两个核心的概念
类:是一类具有相同特征或行为的事物的一个统称
对象:由类创建出来的一个具体的存在
类和对象的关系:先有类再有对象
类是模板 对象是根据这个模板创建出来的
类只需要有一个 对象可以有多个

类:属性(这一类事务的共同信息) 和 方法(你能完成的动作)
1.类名:这类事物的名字(大驼峰命名法)
大驼峰命名法:
1.每个单词的首字母大写
2.单词与单词之间没有下划线
2.属性:这个类创建出来的对象有什么特征
3.方法:这个类创建出来的对象有什么行为

类名的确定
名词提炼法分析整个业务流程,出现的名词,通常就是找到的类

属性和方法的确定
对 对象的特征描述,通常可以定义成属性
对象具有的行为(动词),通常可以定义为方法
提示:需求中没有涉及的属性或方法在设计类时,不需要考虑

类的属性和对象的属性的区别:
类的属性:数据属性和函数属性,数据属性是所有对象共有的,函数属性是绑定对象使用的
对象的属性:对象是类的实例化

类和对象在内存中是如何保存的
类是在定义阶段便生成命名空间,以字典形式保存。通过__dict__查看
对象以字典形式保存。

self:
哪一个对象调用的方法,self就是哪一个对象的引用;
在封装的方法内部,self就表示当前调用方法对象自己;
self.name :接受外部传递的参数。

# 定义一个猫类
class Cat:def eat(self):print('%s 爱吃鱼' %(self.name))def drink(self):print('小猫要喝水')# 创建猫对象
# print(Cat())
tom = Cat()
tom.name = 'Tom'
print(tom.name)
print(tom)
tom.drink()
tom.eat()

初始化方法:
类名() 就可以创建一个对象
类名() 创建对象的时候,python解释器会自动执行以下操作
1.为对象在内存中分配空间–创建对象
2.调用初始化方法为对象的属性设置初始值
这个初始化方法是内置方法,是专门用来定义一个类据有哪些属性和方法的

class Cat:def __init__(self, new_name):# print('这是一个初始化方法')self.name = new_namedef eat(self):print('%s爱吃鱼' % (self.name))def drink(self):print('%s要喝水' % (self.name))
hello_kitty = Cat('hello_kitty')
print(hello_kitty)
hello_kitty.eat()
hello_kitty.drink()
tom = Cat('蓝猫')
tom.drink()
tom.eat()

如果希望在创建对象的同时,就设置对象的属性,可以对__init__方法进行改造
1.把希望设置的属性值,定义成__init__方法的参数
2.在方法内部使用self.属性名 = 形参 接收外部传递的参数
3.在创建对象的时候,使用类名(属性)调用

str:在python中 使用print输出对象变量时候,默认情况下
会输出这个变量引用的对象是由哪一个类创建的对象以及在内存中的地址
如果在开发中,希望使用print输出变量的时候,能够打印自定义内容
就可以利用__str__这个内置的方法了

class Cat:def __init__(self,name):self.name = name# def __str__(self):#     # 返回必须是一个字符串#     return '我是 %s' %(self.name)
tom = Cat('tom')
print(tom)
addr = id(tom)
print(addr)
print('%x' %(addr))
print('%d' %(addr))
fentiao = Cat('粉条')
print(fentiao)

del:如果希望在对象被销毁之前,再做一些事情,可以考虑一下__del__
当一个对象被从内存中销毁前(把这个对象从内存中删除掉),
会自动调用 __del__方法

class Cat:def __init__(self,name):self.name = nameprint('%s 来了' %(self.name))def __del__(self):print('%s 走了' %(self.name))tom = Cat('tom')
print(tom.name)
del tom
print('*' * 50)
print(tom.name)

栈:先进后出 入栈(push) 出栈(pop) 取栈顶元素 判断栈是否为空 ,显示栈元素、列表
队列:先进先出

class Stack:def __init__(self):self.stack = []def push(self,value):""":param value:入栈元素:return:"""self.stack.append(value)return Truedef pop(self):# 判断栈是否为空if self.stack:# 获取出栈元素 并返回item = self.stack.pop()return itemelse:return Falsedef top(self):if self.stack:return self.stack[-1]else:return Falsedef length(self):return len(self.stack)def view(self):return ','.join(self.stack)s = Stack()
s.push('1')
s.push('2')
s.push('3')
item = s.pop()
print(s.view())

面向对象的三大特点:

1 . 封装:
1.封装是面向对象编程的一大特点
2.面向对象编程的第一步 将属性和方法封装到一个抽象的类中
3.外界使用类创建对象,然后让对象调用方法
4.对象方法的细节都被封装在类的内部

需求
1.小明体重75.0公斤
2.小明每次跑步都会减肥0.5公斤
3.小明每次吃东西体重都会增加1公斤

需求
1.小明和小美都爱跑步
2.小美体重45.0公斤
2.每次跑步都会减肥0.5公斤
3.每次吃东西体重都会增加1公斤

class Person:def __init__(self,name,weight):self.name = nameself.weight = weightdef __str__(self):return '我的名字叫 %s 体重是 %.2f' %(self.name,self.weight)
# 在对象的方法内部,是可以直接访问对象的属性的def run(self):print('%s 去跑步~~~~' %(self.name))self.weight -= 0.5def eat(self):print('%s 去吃东西~~~' %(self.name))self.weight += 1
xiaoming = Person('小名',75.0)
xiaoming.run()
xiaoming.eat()
print(xiaoming)
xiaomei = Person('小美',45.0)
xiaomei.eat()
print(xiaomei)

查看学生的分数的及等级

class Student:def __init__(self,name,score):"""初始化方法 当创建实例的时候会调用这个方法"""self.name = nameself.score = scoredef get_grade(self):"""对数据进行封装"""print('my name is %s' %(self.name))if self.score > 90:print('Your grade is A')elif self.score > 75:print('Your grade is B')else:print('Your grade is C')
tom = Student('tome',80)
tom.get_grade()

一个对象的属性 可以是另一个对象创建的类

需求:
1.房子有户型,总面积和家具名称列表
新房子是没有家具的
2.家具有名字和占地面积,其中
eg:占地 6平方米
3.将以上三件家具添加到房子中
4.打印房子的时候,要求输出:户型 总面积 剩余面积 家具名称列表

class HouseItem:# 初始化方法def __init__(self,name,area):self.name = nameself.area = areadef __str__(self):return '[%s] 占地 %.2f' %(self.name,self.area)class House:def __init__(self,house_type,area):self.house_type = house_typeself.area = area# 剩余面积self.free_area = areaself.item_list = []def __str__(self):return ('户型:%s\n总面积:%.2f[剩余:%.2f]\n家具:%s'%(self.house_type,self.area,self.free_area,self.item_list))def add_item(self,item):# 判断家具的面积if item.area > self.free_area:print('%s 的面积太大了,无法添加' %(item.name))return# 要将家具的名称添加到列表中去self.item_list.append(item.name)# 计算剩余面积self.free_area -= item.area
# 创建家具
bed = HouseItem('床',4)
print(bed)
chest = HouseItem('chest',600)
print(chest)
table = HouseItem('table',1.9)
print(table)
# 创建房子对象
my_home = House('两室一厅',90)
# 将家具添加到房子里面去
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print(my_home)
# 一个对象的属性 可以是另一个对象创建的类

1.士兵瑞恩有一把AK47
2.士兵可以开火(士兵开火扣动的是扳机)
3.枪 能够 发射子弹(把子弹发射出去)
4.枪 能够 装填子弹 --增加子弹的数量

class Gun:def __init__(self,model):self.model = modelself.bullet_count = 0def add_bllet(self,count):self.bullet_count += countdef shoot(self):if self.bullet_count <= 0:print('%s 没有子弹了...' %(self.model))returnself.bullet_count -= 1print('%s ~~~~%s' %(self.model,self.bullet_count))class Soldier:def __init__(self,name):self.name =nameself.gun = Nonedef fire(self):if self.gun == None:print('%s  还没有枪...' %(self.name))returnself.gun.add_bllet(50)self.gun.shoot()ak47 = Gun('ak47')
# ak47.add_bllet(50)
# ak47.shoot()
ryan = Soldier('Ryan')
ryan.gun = ak47
ryan.fire()
ryan.fire()

2 . 继承:
实现代码的重用,相同的代码不需要重复的写

class Animal:def eat(self):print('吃~~~')def drink(self):print('喝~~~')def run(self):print('跑~~~')def sleep(self):print('睡~~~')
class Cat(Animal):def call(self):print('瞄喵~~')
class Dog(Animal):def bark(self):print('汪汪~~')fentiao = Cat()
fentiao.run()
fentiao.eat()
fentiao.sleep()
fentiao.drink()
fentiao.call()dahuang = Dog()
dahuang.eat()
dahuang.drink()
dahuang.run()
dahuang.sleep()
dahuang.bark()

继承具有传递性
当父类方法的实现不能满虚子类的需求的时候
可以对方法进行重写
1.覆盖父类方法
2.对父类方法进行扩展

lass Animal:def eat(self):print('吃~~~')def drink(self):print('喝~~~')def run(self):print('跑~~~')def sleep(self):print('睡~~~')class Cat(Animal):def call(self):print('瞄喵')class HelloKitty(Cat):def speak(self):print('我可以说日语')def call(self):# 调用原本在父类中封装的方法super().call()# Cat.call(self) python2.x# 针对子类特有的需求,编写代码print('##@!#@!#')
kt = HelloKitty()
kt.call()
kt.speak()
kt.eat()
kt.drink()
kt.run()
kt.sleep()

扩展父类方法示例:

class Bird:def __init__(self):self.hungry = True
# 鸟吃过了以后,它就不再饥饿def eat(self):if self.hungry:print('Akkkk~')self.hungry = Falseelse:print('No Thanks')# 在鸟类的基础上 增加唱歌的功能
class SongBird(Bird):def __init__(self):self.sound = 'dsadsda'super().__init__()def sing(self):print(self.sound)bird = Bird()
bird.eat()
littlebird = SongBird()
littlebird.eat()
littlebird.sing()

子类同时继承两类示例:

class A:def test(self):print('A----test方法')def demo(self):print('A-----demo方法')
class B:def test(self):print('B----test方法')def demo(self):print('B----test方法')class C(B,A):passc = C()
c.test()
c.demo()

新式类和旧式(经典)类:
object是Python为所有对象提供的基类,提供有一些内置的属性和方法,可以使用dir函数查看
新式类:以object为基类的类
经典类 不以object为基类的类

在python3.X中定义的类时,如果没有指定父类,会默认使用object作为基类–python3.x中定义的类都是新式类
在python2.x中定义类时,如果没有指定父类,则不会以object作为基类

为保证编写的代码能够同时在python2.x和python3.x运行
今后在定义类时,如果没有父类,建议统一继承自object

>>> class A:
...     pass
...
>>>
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> class B(object):
...     pass
...
>>> dir(B)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']"""
class A(object):pass

3 . 多态:
多态(以封装和继承为前提)
不同的子类对象调用相同的方法,产生不同的执行结果

class Dog(object):def __init__(self,name):self.name = namedef game(self):print('%s 开心的玩~' %(self.name))
class Gaofei(Dog):# 父类方法不能满足子类的需求,重写game方法def game(self):print('%s和米老鼠一起玩~~~' %(self.name))
class Person(object):def __init__(self,name):self.name = namedef game_with_dog(self,dog):print('%s和%s玩' %(self.name,dog.name))
# 创建一个狗对象
#wangcai = Gaofei('高飞')
wangcai = Dog('大黄')
# 创建一个人对象
xiaoming = Person('小明')
# 让小明和狗玩
xiaoming.game_with_dog(wangcai)

类属性:针对类对象定义的属性 使用赋值语句在class关键字下可以定
义类属性
类方法:针对类对象定义的方法 在类方法内部可以直接访问类属性或者调用
其他的类方法

class Toy(object):# 使用赋值语句定义类属性,记录所有的玩具的数量count = 0def __init__(self,name):self.name = name# 让类属性 +1Toy.count += 1@classmethoddef show_toy_count(cls):print('玩具对象的数量 %d' %(cls.count))
# 创建玩具对象
# toy1 = Toy('乐高')
# toy2 = Toy('泰迪熊')
# 调用类方法
Toy.show_toy_count()

静态方法:非绑定方法,类和对象都可以调用

class Cat(object):@staticmethoddef call():print('喵')
# 通过 类名. 调用静态方法
Cat.call()
# 不需要创建对象 直接就可以调用

私有属性和私有方法:

class Student(object):def __init__(self,name,score):# 前面带两个下划线表示对变量进行私有化,# 外部不能随便的访问和更改self.__name = nameself.__score = scoredef get_grand(self):print('my name is %s,my ''grade is  %d' %(self.__name,self.__score))def get_name(self):return self.__namedef get_score(self):return self.__scoredef set_name(self,name):if isinstance(name,str):self.__name = nameelse:raise ValueError('请输入正确的名字')def set_score(self,score):if isinstance(score,int):self.__score = scoreelse:raise ValueError('请输入正确的成绩')tom = Student('Tom',89)
# print(tom.name)
# print(tom.score)
tom.get_grand()
# print(tom._Student__name)
#tom.__name = 'new name' # 这样做只是给实例添加了__name的属性,并不是
# 修改私有属性变量
tom.set_name(321321)
tom.set_score(90)
print(tom.get_name())
print(tom.get_score())

设计模式——单例
单例设计模式
设计模式
设计模式是前人工作的总结和提炼,通常,被人们广泛流传的设计模式都
是针对某一特定问题的成熟解决方案
使用设计模式是为了可重用代码,让代码更容易被他人理解,
保证代码可靠性

单例设计模式
目的:让类创建对象,在系统中只有唯一的一个实例
每一次执行类名()返回的对象
内存地址是相同的

使用__new__(cls)方法实现单例设计模式:
我们用 类名. 的方式创建对象的时候,python解释器会帮我们做两件事情
1.为对象分配空间
2.对象初始化

__new__是一个由object基类提供的内置的静态方法,主要有两个作用:
在内存中为对象分配空间
返回对象的引用

python的解释器获得对象的引用后,将引用作为第一个参数,传递给__init__方法
#new:负责给对象分配空间 init(初始化方法)负责给对象初始化

class MusicPlayer(object):instance = Nonedef __new__(cls, *args, **kwargs):print('创建对象 分配空间')# 1.创建对象的时候,new方法会被自动调用#instance = object.__new__(cls)#return instance #返回的是对象的引用# 判断类属性是否是空对象if cls.instance is None:# 调用父类方法 为第一个对象分配空间cls.instance = object.__new__(cls)return cls.instanceplayer1 = MusicPlayer()
player2 = MusicPlayer()
player3 = MusicPlayer()print(player1)
print(player2)
print(player3)

python—面向对象相关推荐

  1. python面向对象的优点_Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

  2. 这可能是Python面向对象编程的最佳实践

    作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...

  3. 第八课.Python面向对象(二)

    类的继承和多态 继承和多态与函数有共同的目的,都是为了减少代码的冗余,提高复用的效率: 根据"Python面向对象(一)"的笔记,我现在定义一个Cinema类: #父类 class ...

  4. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  5. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  6. Python 面向对象 基础

    编程范式概述: 面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实 ...

  7. python面向对象类属性_python面向对象之类属性和类方法案例分析

    本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发, ...

  8. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  9. python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!

    原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...

  10. python面向对象编程的优点-Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

最新文章

  1. TensorFlow(3)张量与变量
  2. 编程模式 之美 -- 抽象工厂模式
  3. 观察者模式/ java实现附代码 /
  4. Linux内存映射--mmap函数
  5. Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】
  6. mysql把用户权限授予新用户_MySQL新建普通用户和库并授予新用户对新库的所有权限...
  7. Overload重載和Override重写的区别。Overloaded的方法是否可以改变返回值的类型?
  8. 你真的理解 Integer 的缓存问题吗?| CSDN 博文精选
  9. exchange 2003 event id 1221
  10. AcWing 788. 逆序对的数量
  11. Hibernate之连接池配置
  12. Otsu最大类间方差法
  13. html的iframe用法
  14. [Unity][FairyGUI]富文本改变颜色
  15. 专访邓中亮:位置信息是大数据的基石
  16. 求三个数的最小公倍数的解法之美
  17. Ubuntu通过wine安装QQ无法输入账号怎么办?
  18. aircrack-ng 介绍、功能测试及部分源码分析
  19. Unity随记(一) LookAt和LookRotation的使用
  20. Linux服务器12小时制转24小时制

热门文章

  1. 谭民机器人_机器人视觉伺服研究进展-中科院自动化所-谭民.
  2. oracle dbf 超大,oracle 数据库users01.dbf文件过大 转移方法
  3. 为什么python 为什么没有接口_python做接口测试的必要性
  4. 神经网络的全连接层_深度神经网络全连接层
  5. Docker容器的重启策略
  6. golang cobra powershell补全脚本
  7. Docker+Nginx部署Angular国际化i18n
  8. iOS开发-自定义UIAlterView(iOS 7)
  9. zabbix邮件通知,短信通知配置详解
  10. 外键为','(逗号)拼接ID,连接查询外键表ID