python—面向对象

面向过程 面向对象:

面向过程:—侧重于怎么做?
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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5中bug vue_苹果官网出BUG!这些都只要一两百元

近日&#xff0c;有网友在网上反馈称&#xff0c;他发现苹果官网商城出现了BUG&#xff01;众多上千元的产品&#xff0c;BUG价只需一两百元。比如Shure MOTIV MV88 Digital立体声电容式麦克风配件。正常售价1288元&#xff0c;而BUG后的价格是235元。UBTECH Jimu Astrobot Cos…

常用压缩,解压与打包

常用压缩格式&#xff1a; .zip .zg .bz2 .tar.gz .tar.bz2.zip格式压缩zip 压缩文件名 源文件#压缩文件注&#xff1a;压缩文件名写.zip后缀是为了标记该文件的压缩类型&#xff0c;方便管理。注&#xff1a;在压缩时有压缩格式转换&#xff0c;所以当源文件很小时&#xff0c…

css禁用选中文本_使用CSS禁用文本选择突出显示

css禁用选中文本Introduction: 介绍&#xff1a; Texts are the most fundamental elements of any websites or web pages, they form the basis of the web pages or websites because if you don’t write something that you will not be able to present anything. There…

CDN加速实现—varnish

CDN介绍&#xff1a; 1 . 对cdn的理解&#xff1a; CDN的全称是&#xff08;Content Delivery Network&#xff09;&#xff0c;即内容分发网络&#xff1b;加速器&#xff0c;反向代理缓存。CDN系统能够实时的根据网络流量和各节点的连接&#xff0c;负载状况以及到用户的举例…

3dmax如何拆分模型_3dmax制作装饰柜1

大家好&#xff0c;今天我来为大家讲解一下如何利用3dmax制作装饰柜。我们需要制作装饰柜模型&#xff0c;当我们为它添加一个材质后&#xff0c;它就是这样的效果。单击创建&#xff0c;选择图形&#xff0c;对象为样条线&#xff0c;选择矩形在场景中进行创建。单击修改&…

TODO:macOS上ThinkPHP5和Semantic-UI集成

TODO&#xff1a;macOS上ThinkPHP5和Semantic-UI集成1. 全局安装 (on OSX via homebrew)Composer 是 homebrew-php 项目的一部分2. 把Xcode升级到8.1后继续安装Composer3. 使用composer创建TP5项目MWL-Dispatchcomposer create-project topthink/think MWL-Dispatch4. 配置apac…

np.expm1_JavaScript中带有示例的Math.expm1()方法

np.expm1JavaScript | Math.expm1()方法 (JavaScript | Math.expm1() Method) Math operations in JavaScript are handled using functions of math library in JavaScript. In this tutorial on Math.expm1() method, we will learn about the expm1() method and its workin…

距离传感器控制灯泡代码_生迪全彩智能 LED 灯泡体验评测

市面上大多数智能灯具无外乎智能控制&#xff0c;冷暖标准区间的简单调光&#xff0c;仅仅满足我们日常照明之外&#xff0c;似乎用处不多。如果有一款能在自己房间制造多彩氛围的灯泡就好了。这次有幸体验到了华为智能家居生态链产品生迪全彩智能 LED 灯泡&#xff0c;才发现彩…

mysql启动与关闭(手动与自动)

手动管理mysql的启动与关闭 [rootmysql ~]# service mysql start --手动启动mysqlStarting MySQL. SUCCESS![rootmysql ~]# service mysql stop --手动关闭mysql Shutting down MySQL.. SUCCESS! [rootmysql ~]# mysqld --verbose --help --查看MySQL的默认参数的具体值 如果每…

JavaScript中带有示例的Math.round()方法

JavaScript | Math.round()方法 (JavaScript | Math.round() Method) Math.round() is a function in math library of JavaScript that is used to round the given number floating-point number to the nearest integer value. Math.round()是JavaScript数学库中的函数&…

内部导线拉力测试_珠海后环回收试验机现金支付拉力试验机回收和谐温馨的环境...

珠海后环回收试验机现金支付拉力试验机回收和谐温馨的环境深圳富兴二手设备回收&#xff0c;拉力试验机回收&#xff0c;恒温恒湿箱回收&#xff0c;恒温恒湿试验箱回收&#xff0c;恒温恒湿培养箱回收&#xff0c;高低温试验箱回收&#xff0c;高低温冲击试验机回收&#xff0…

lvs负载均衡—ldirectord(DR模式的健康检查)

作用&#xff1a; 健康检查对企业而言也是由为重要&#xff0c;在生活中&#xff0c;有时候访问网页访问不到&#xff0c;就会跳出来一些图形告诉你访问失败&#xff0c;这就是健康检查的作用&#xff0c;当服务器都挂掉的时候&#xff0c;告诉你暂时访问不了。 ldirectord是后…

Reactor by Example--转

原文地址&#xff1a;https://www.infoq.com/articles/reactor-by-example Key takeaways Reactor is a reactive streams library targeting Java 8 and providing an Rx-conforming APIIt uses the same approach and philosophy as RxJava despite some API differencesIt i…

springboot项目后台运行关闭_springboot项目在服务器上部署过程(新手教程)

环境&#xff1a;服务器系统&#xff1a;ubuntu16jdkmysql工具 xshell6下载地址&#xff1a;https://www.netsarang.com/download/down_form.html?code622&downloadType0&licenseType1xftp6下载地址&#xff1a;https://www.netsarang.com/download/down_form.html?c…

如何在React Native中使用文本输入组件?

You know, an app becomes more authentic and professional when there is the interaction between the app and the user. 您知道&#xff0c;当应用程序与用户之间存在交互时&#xff0c;该应用程序将变得更加真实和专业。 The text input component in react-native brin…

lvs负载均衡—NAT模式

NAT模式原理图 Virtual Server via NAT &#xff1a; 用地址翻译实现虚拟服务器,地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址,外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。 优点是节省IP …

Django1.9开发博客06- 模板继承

模板继承就是网站的多个页面可以共享同一个页面布局或者是页面的某几个部分的内容。通过这种方式你就需要在每个页面复制粘贴同样的代码了。 如果你想改变页面某个公共部分&#xff0c;你不需要每个页面的去修改&#xff0c;只需要修改一个模板就行了&#xff0c;这样最大化复用…

乐高机器人亮剑_2500名选手大比拼 全球机器人广州从化“亮剑”

导读&#xff1a;国际机器人从化总动员学生自己编程、拼装的机器人既能像相扑手一样摔跤&#xff0c;又能像蜘蛛侠一样爬上爬下。还有智能垃圾处理系统&#xff0c;瞄准城市垃圾分类下的“痛点”。在2019RoboRAVE国际教育机器人大会全球总决赛的现场&#xff0c;只有想不到&…

python 编码问题_Python电源挑战| 竞争编码问题

python 编码问题Question: 题&#xff1a; A power function is that positive number that can be expressed as x^x i.e x raises to the power of x, where x is any positive number. You will be given an integer array A and you need to print if the elements of arr…

lvs负载均衡—高可用集群(keepalived)

基本概念&#xff1a; 什么是Keepalived呢&#xff0c;keepalived观其名可知&#xff0c;保持存活&#xff0c;在网络里面就是保持在线了&#xff0c;也就是所谓的高可用或热备&#xff0c;用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发…