day22面向对象编程思想
day22面向对象编程思想
1、面向过程
面向过程:
核心是“过程”二字
过程的终极奥义就是将程序流程化
过程是“流水线”,用来分步骤解决问题的
面向对象:
核心是“对象”二字
对象的终极奥义及时将程序“整合”
对象是“容器”,用来盛放数据和功能的
1.1类的定义和对象的产生
'''
驼峰体命名:大驼峰,小驼峰
大驼峰:UserName ==> 类名推荐使用
小驼峰:userName
下划线的命名:user_name 除类名外推荐使用
类名的命名:大驼峰
class 类名()
pass
是先有类还是先有对象?
1.现实中:
先有对象,在有类
2.在程序中:
必须要先定义类,在调用类得到的对象
'''
定义类:
class Student():
school = "SH"
def choose_course(sth_obj,course)
pass
print(123)
'''
定义类发生了几件事:
1.立即执行类体代码
2.产生一个类的名称空间,把类体中的属性名和函数名都扔到一个大字典中
3.把类的名称空间绑定给__dict__ 类名:__dict__
'''
2、类
代码1:
class Student:
stu_school = 'oldboy'
def tell_stu_info(stu_obj):
print('学生信息:姓名:%s 年龄:%s 性别:%s'%(
stu_obj['stu_name'],
stu_obj['stu_age'],
stu_obj['stu_gender'],
))
def set_info(stu_obj,x,y,z):
stu_obj['stu_name'] = x
stu_obj['stu_age'] = y
stu_obj['stu_gender'] = z
# 属性访问的方法
print(Student.stu_school) # 访问数据类型
print(Student.set_info) # 访问函数属性
代码2:
def init(obj,x,y,z):
obj.stu_name = x
obj.stu_age = y
obj.stu_gentre = z
class Student:
stu_school = 'oldboy'
count = 0
def __init__(obj, x, y, z):
Student.count+=1
obj.stu_name = x
obj.stu_age = y
obj.stu_gentre = z
def tell_stu_info(stu_obj):
print('学生信息:姓名:%s 年龄:%s 性别:%s'%(
stu_obj['stu_name'],
stu_obj['stu_age'],
stu_obj['stu_gender'],
))
def set_info(stu_obj,x,y,z):
stu_obj['stu_name'] = x
stu_obj['stu_age'] = y
stu_obj['stu_gender'] = z
调用类的过程,又称为实例化,发生了三件事
1、先产生一个空对象
2、python会自动调用类中的__init__方法然后将空对象已经调用类时括号内传入的参数一同传给init
3、返回初始化好的对象
stu1_obj =Student('meng',18,'male')
print(stu1_obj.__dict__)
print(stu1_obj.count)
总结__init__方法
'''
1、会在调用时自动触发执行,用来为对象初始化自己独有的数据
2、__init__内应该存放是为对象初始化属性的功能,但是是可以存放任意其他代码,
想要在类调用时就立刻执行的代码都可以放到该方法内
3、__init__方法必须返回None
'''
代码3:
# 1. 绑定给对象的
class Student():
school = 'SH'
def __init__(self,name,age):
self.name =name
self.age = age
# 在类中书写方法,默认绑定给对象使用的
def tell_info(self):
print('%s-%s'%(self.name,self.age))
def func(self):
print('func')
obj = Student('meng',18)
obj.tell_info()
obj.func()
3、property
案例1:
class People:
def __init__(self,name,weight,height):
self.name = name
self.weight = weight
self.height = height
@property #加上了就不用再调用了===》print(obj1.bmi())
def bmi(self):
return self.weight / (self.height ** 2)
obj1 = People('meng',60,1.75)
print(obj1.bmi)
定义函数的原因:
1.从bmi的公示上看,bmi应该是触发功能计算得到的
2、bmi是随着身高、体重而动态变化的,不是一个固定的值,每次需要重新计算得到
4、继承
1、什么是继承
1)继承是一种创建新类的方式,新建的类可称为子类或者派生类,父类又可称为基类或超类,子类可以遗传父类的属性
2)需要注意的是:python支持多继承
3)在python中、新建的类可以继承一个或者多个父类
2、为什么要用继承
类解决的是对象与对象之间的代码冗余问题
用来解决类与类之间代码冗余问题
3、ps1:在python2中有经典类和新式类之分
新式类:继承了object类的子类,以及该子类的子子孙孙类
经典类:没有继承object类的子类,以及该子类的子子孙孙类
ps2:在python3中没有继承任何类,那么都会默认object类,所以python3中所有的类都是新式类
"""
学会子类如何使用父类的属性
1. 指名道姓:People.__init__(self, name, age, gender)
2. super():
"""
代码1:
class People():
school = 'SH'
def __init__(self,name,age,genter):
self.name = name
self.age = age
self.genter = genter
class Student(People):
def __init__(self,name,age,genter,course=None):
if course is None:
course =[]
self.course = course
People.__init__(self,name,age,genter)
def choose_course(self,course):
self.course.append(course)
print('%s选课成功%s'%(self.name,self.course))
stu =Student('meng',19,'male')
print(stu.school)
print(stu.name)
print(stu.age)
print(stu.genter)
# 补充:
class Teacher(People):
def __init__(self, name, age, genter, level):
self.level = level
People.__init__(self, name, age, genter)
def score(self, stu_obj, score):
stu_obj.score = score
print('%s给%s打了%s分' % (self.name, stu_obj.name, score))
tea = Teacher('meng', 18, 'male', 11)
print(tea.name)
print(tea.age)
print(tea.genter)
print(tea.level)
5、单继承下的属性查找
例子1:
class Foo():
def f1(self):
print('Foo.f1')
def f2(self):
print('Foo.f2') # 先输出
self.f1()
class Bar(Foo):
def f1(self): # 后输出
print('Bar.f1')
obj = Bar()
obj.f2()
结果:Foo.f2,Bar.f1
例子2:
class Foo:
def __f1(self):
print('Foo.f1') # 后执行
def f2(self):
print('Foo.f2') # 先执行
self.__f1()
class Bar(Foo):
def f1(self):
print('Bar.f1')
obj = Bar()
obj.f2()
# 总结:找一个值先在对象里找,然后再去类找
6、多继承下的属性
# 新式类中属性查找按照 广度优先查询
# 经典类中属性查找按照 深度优先查询
class G(object):
# def test(self):
# print('from G')
pass
class F(G):
# def test(self):
# print('from F')
pass
class C(F):
# def test(self):
# print('from C')
pass
class D(G):
# def test(self):
# print('from D')
pass
class E(G):
# def test(self):
# print('from E')
pass
class H():
def test(self):
print('from H')
pass
class B(E, H):
# def test(self):
# print('from B')
pass
class A(B, C, D):
# def test(self):
# print('from A')
pass
f1 = A()
f1.test()
7、super()和mro()
class A:
def test(self):
print('A---->test')
super().aaa()
class B:
def test(self):
print('B---->test')
def aaa(self):
print('B---->aaa')
class C(A, B):
def aaa(self):
print('C----->aaa')
# c = C()
# c.test() # 打印结果:
# print(C.__mro__)
a = A()
# a.test()
print(A.__mro__)
8、多态与多态性
# 多态:一种事物的多种形态
水:固态水,液态水, 气态水
动物:人,猪, 狗
# 继承, 子类使用父类的属性
多态类中的继承:不是让子类遗传父类的属性
多态带来的特性:在不考虑对象的数据类型的情况下,直接调用方法
9、绑定方法
一、绑定方法:特殊之处就在于将调用者本身当做第一个参数自动传入
1.绑定给对象的方法:调用者是对象,自动传入的是对象
2.绑定给类的方法:调用者类,自动传入的是类
3.应用场景:提供一种新的造对象的方式,来自于配置文件之类的
例子:
impore settings
class Mysql:
def __init__(self,ip,port):
self.ip = ip
self.port = port
def func(self):
print('%s:%s'%(selp.op,selp.port))
@classmethod #将下面的函数装饰成绑定给类的方法
def from_conf(cls):
print(cls)
return cls(settings.ip,settings.port)
obj1 = Mysql(111,3303)
10.非绑定方法
一、非绑定方法===># 静态方法
用途:不加入任何装饰器的情况下,默认绑定给对象的。
不需要类和对象
class Mysql:
def __init__(self,ip,port):
self.nid = self.create_id() # 自动生成一个id
self.ip = ip
self.port = port
@staticmethod # 将下述函数装饰成一个静态方法
def create_id(x,y,z):
print(x,y,z)
import uuid
return uuid.uuid4()
obj1 = Mysql(111,3303)
print(Mysql.create_id)
Mysql.create_id(1,2,3)
obj1.create_id(4,5,6)
day22面向对象编程思想的更多相关文章
- 面向对象编程思想(OOP)
本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...
- IT第二十天 - 面向对象编程思想、抽象类、异常处理、程序操作日志记录、本周总结 ★★★
IT第二十天 上午 面向对象编程思想 1.组装电脑的设计: (1)电脑的组成:显示器+机箱 (2)机箱的组成:电源+主板+硬盘 (3)主板所包含的部件:cpu+内存+PCI接口+usb接口 (4)PC ...
- 面向对象编程思想(前传)--你必须知道的javascript
在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 ...
- 面向对象编程思想(OOP)
本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...
- 面向对象编程思想(前传)--你必须知道的javascript(转载)
原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录 什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 ...
- PHP中面向对象编程思想的3个特征
面向对象编程思想的3个特征: 封装: 无非是一个大的指向思想,目的是为了将一个类设计得更为健壮! 其基本做法是: 尽可能地将一个类的成员私有化,只开放那些必不可少的对外的属性或方法,能private的 ...
- 面向对象编程思想(OOP)(转发)
本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...
- 面向对象编程思想(OOP)总结
本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...
- java面向对象编程思想的理解
1.我们总说java是一门面向对象编程的语言,那什么是面向对象呢? 我是这样理解的,对象是事物存在的实体,如,猪.狗,花早等都是对象,对象由两部分组成.面向对象编程的三大特点:继承,多态,类是封装对象 ...
随机推荐
- 2021CCPC河南省赛(部分代码待更)
最终A了8道题, 喜提一金, 也是在意料之中. 第一次三个队友集中在一起打比赛, 也体验了一下线下的氛围, 还是比较赞的, 自己也不是说毫无作用, 帮助团队做了几道题, 还是挺满意的. 1002 em ...
- hdu 1848 Fibonacci again and again (SG)
题意: 3堆石头,个数分别是m,n,p. 两个轮流走,每走一步可以选择任意一堆石子,然后取走f个.f只能是菲波那契中的数(即1,2,3,5,8.....) 取光所有石子的人胜. 判断先手胜还是后手胜. ...
- cf Two Sets (我用二分最大匹配做的)
题意: n个数p1,p2....pn 两个数a,b 把它们分成A,B两个集合. 若x属于A,a-x一定属于A. 若x属于B,b-x一定属于B. 问是否可能将这n个数分成两个集合.若可以,输出每 ...
- jenkins项目发布
目录 一.简介 二.docker打包 一.后端打包 二.前端打包 三.启动容器 四.完整代码 五.发布测试 六.优化方案 七.源码地址: 八.参考 一.简介 1.该章节基于jenkins.Harbor ...
- 【JAVA】笔记(6)--- toString方法;equals方法;finalize方法;package与import;内部类;
toString: 1.每创建一个类时,都要重写 toString 方法,这是敲代码的基本素养: 2.重写规则:简单明了: 3.String 类中也有toString方法(SUN公司写的): equa ...
- 理解PHP的运行机制
PHP是一种纯解释型在服务端执行的可以内嵌HTML的脚本语言,尤其适合开发Web应用程序.请求一个 PHP 脚本时,PHP 会读取该脚本,并将其编译为 Zend 操作码,这是要执行的代码的一种二进制表 ...
- 仿Word的支持横轴竖轴的WPF 标尺
最近在 https://mp.weixin.qq.com/s/3dEO0NZQv5YLqK72atG4Wg 官方公众号看到了 用WPF 制作 标尺 在去年项目上也接到了一个需求,用于排版自定义拖 ...
- [atARC087F]Squirrel Migration
对这棵树重心情况分类讨论: 1.若这棵树存在两个重心,分别记作$x$和$y$,如果将$(x,y)$断开,两棵子树大小都相同(都为$\frac{n}{2}$),此时$p_{i}$与$i$必然不同属于一个 ...
- spring-整合es
spring-整合es 导入pom <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- JdbcTemplate 、Mybatis、ORM 、Druid 、HikariCP 、Hibernate是什么?它们有什么关系?
JdbcTemplate .Mybatis.ORM .Druid .HikariCP .Hibernate是什么?它们有什么关系? 学完Spring和SpringMVC之后,就急于求成的开始学习起Sp ...