面向对象编程介绍
面向过程的编程思想
核心过程二字,过程指的是解决问题的步骤,即先干什么\再干什么\后干什么
基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式
优点:复杂的问题流程化\进而简单化 (一步步去思考,写一步走一步)
缺点:可扩展性差
(加一点参数或者方法可能改掉原来的代码,
一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,
即便是能,也得是大改,改一个组件,牵一发而动全身。)
就像打工自己需要技术,学历,工作经验等等
老板或者领导把事情安排好就ok了,员工只需要照着去做,能赚钱就OK
面向对象的编程思想
核心是对象二个字,对象是特征与技能的结合体
基于该思想编写程序(脑子始终想的是对象二字)就好比在创造一个世界,世界是由
一个个对象组成,在上帝眼里任何存在的事物都是对象,任何不存在的事物也都可以创造
出来,是一种上帝式的思维方式
优点: 可扩展性强 (比如:加属性加方法,有框架体系
对某一个对象单独修改,会立刻反映到整个体系中,
如对游戏中一个人物参数的特征和技能修改都很容易。)
缺点: 编程的复杂度要高与面向过程
(难度高,要看应用场景
面向对象的程序设计看起来高大上,所以我在编程时就应该保证通篇类,
这样写出的程序一定是好的程序(面向对象只适合那些可扩展性要求比较高的场景)
比如,假设大海老师会降龙十八掌的十八掌,那么我每次跟人干仗都要从第一掌打到
第18掌降龙有悔
这才显得我很厉害:
面对敌人,我打到第三掌对方就已经倒下了,我说,不行,你给我起来,我还没有show完…
3.类有类属性,实例/对象有实例/对象属性,所以我们在定义class时一定要定义出那么几个类属性,
想不到怎么办,那就使劲的想,定义的越多越牛逼
这就犯了一个严重的错误,程序越早面向对象,死的越早,为啥面向对象,
因为我们要将数据与功能结合到一起,程序整体的结构都没有出来,
或者说需要考虑的问题你都没有搞清楚个八九不离十,你就开始面向对象了,
这就导致了,你在那里干想,自以为想通了,定义了一堆属性,结果后来又都用不到,
或者想不通到底应该定义啥,那就一直想吧,想着想着就疯了。
就像创业:
自己不太需要技术能力,只需要懂那些人拥有这些能力
自己需要规划好创业的每一步,
招聘的时候人才的选择
技术
销售
门面的选择
类:
对象是特征与技能的结合体,而类则是一系列对象相同的特征与技能的结合体
强调:
1.对象是具体存在的事物,而类则一个抽象的概念
2.站在不同的角度总结出的类与对象是不同的
在现实世界中:先有一个个具体存在的对象,然后随着人类文明的发展才
类的使用
1. 定义类
class Teacher:
school = '卡尼路亚滴滴哒' #可以是类的属性,也可以是对象的属性
# 相同的特征/属性/变量
def __init__(self,name,age,sex): #对象的属性
name =name
age = age
sex = sex
# 函数/方法/技能
def course(self):
# self到底是什么?
# self当做一个位置形参
print(self)
print('course')
2.使用类
print(Teacher.school )
对象的使用
1. 先定义类
class Teacher:
school = '卡尼路亚滴滴哒' #可以是类的属性,也可以是对象的属性
#相同的特征/属性/变量
def __init__(self,name,age,sex): #对象的属性
name =name
age = age
sex = sex
#函数/方法/技能
def course(self):
#self到底是什么?
#self当做一个位置形参
print(self)
print('course')
return 'aaa'
2.后调用类来产生对象
调用类的过程称之为类的实例的初始化,调用类的返回值称之为类的一个对象/实例
调用类发生了?
类是抽象 对象/实例是具象
#产生3个老师对象
dahai= Teacher('大海',18,'男')
xialuo= Teacher('夏洛',16,'男')
xishi= Teacher('西施',18,'女')
类的绑定方法/非绑定方法
绑定方法
@selfmethed # 作者把@selfmethed省略了,因为类里面的方法大部分情况下是给实例化后的对象用
def f(self,n):
"self"是给对象用的写法
@classmethod # 绑定类的方法是给类用的
@classmethod
def f(cls,n):
"cls"是规范给类用的写法
非绑定方法
@staticmethod # 非绑定方法/静态方法
@staticmethod
def f(n):
前面没有“self或cls”,只是单纯的行参
1、绑定方法(精髓在于自动传值)
特性:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
绑定方法分为两类:
1.1 绑定给对象方法
在类内部定义的函数(没有被任何装饰器修饰的),默认就是绑定给对象用的
1.2 绑定给类的方法:
在类内部定义的函数如果被装饰器 @classmethod 装饰,
那么则是绑定给类的,应该由类来调用,类来调用就自动将类当作第一个参数自动传入
2、非绑定方法(不会自动传值,就是一个 普通函数)
类中定义的函数如果被装饰器 @staticmethod 装饰,那么该函数就变成非绑定方法
优点
既不与类绑定,又不与对象绑定,意味着类与对象都可以来调用
缺点
但是无论谁来调用,都没有任何自动传值的效果,就是一个普通函数
3 作用
如果函数体代码需要用外部传入的类,则应该将该函数定义成绑定给类的方法
如果函数体代码需要用外部传入的对象,则应该将该函数定义成绑定给对象的方法
如果函数体代码既不需要外部传入的类也不需要外部传入的对象,则应该将该函数定义成非绑定方法/普通函数