今日所得
面向过程编程与面向对象编程
类与对象
属性的写法
初始化对象的属性
为对象定制行为
类绑定方法
面对过程
面对过程编程:核心是过程两个字,过程指的是解决问题的步骤,即先干什么后干什么,这种思想可以理解成一条精心设计好的流水线,是一种机械式的思维方式。
优点是:将复杂性的问题流程化,进而简单化。把一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单
缺点是:一套流水线或者流程就是用来解决一个问题,生产生活用品的流水线无法生产重工产物,即便是能也是需要进行大的改动。即便是小的改动也会牵一发而动全身。
一般应用在基本上不会或者很少改动的场景
面对对象编程
Object Oriental Programming,简称OOP,是一种程序设计思想。它将对象作为程序的基本单元。将数据和处理数据的程序封装到对象中,以提高软件的重用性、灵活性和扩展性为首要目的
面对对象编程的优点:程序员的角色发生了改变,从一个操作者,变成了指挥者,不在需要关心每个功能具体的实现细节,从而可以专注的处理业务逻辑,是一种思想上的转变。
大大提高了程序的扩展性,当一个对象发生了修改时,对其他对象没有任何影响,对象之间相互独立,耦合度变得更低了。
提高了程序的灵活性,例如在游戏中,每个玩家的操作都是自由的,并不固定。
面对对象编程的缺点:编程的复杂度远高于面向过程,不了解面向对象而立即上手设计程序,极容易出现过度设计的问题。
无法像面对过程的程序设计流水线式的可以精准的预测问题的处理流程与结果,面对对象的程序一旦开始就由对象之间的交互解决问题,谁也无法准确的预测最终结果。
应用场景
需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计。
类与对象
类和对象是面向对象编程最核心的两个概念
对象是特征与技能的结合体
在程序中:
用变量来表示对象的特征,用函数表示对象的技能
将这些变量和函数结合在一起,形成一个整体,就是对象,这是面向对象的精髓所在!
对象的另一种理解方式
变量的作用数存储数据,函数的作用数处理数据
对象是将数据与处理数据的函数绑定在一起
类是什么
类就是类型,类别,种类; 是一系列对象中相似特征与技能的结合体
在生活中是一种抽象概念,例如人类,是不具体的
如某个对象属于人类,可以通过类别,了解这个对象具备的特征和技能
反过来看类就是对象的模板,同一类的对象,具备相同的特征和行为
为什么需要类
现实生活中,通过对对象的分析总结,得到类型;用类型来标识不同对象之间的差异;
在程序中,同样用于标识不同对象之间的差异
另一个重要的功能是作为对象的模板,例如学生类,无论是哪个学生都具备学习这个方法,既然是相同的就没必要为每个对象单独编写,学生类负责提供这些相同的方法;
OOP第一步要做的就是定义需要的类
类和对象概念
类:类就是类型,是一种抽象的概念,也就具备相同特征和相同行为的事物的集合。
对象:就是具体的某个事物,具备它自己的特征与行为,可以看做特征和技能的结合体。
类和对象的关系:类包含一系列对象,对象属于某个类
#现有类还是现有对象 """ 在实际生活中:现有对象后有类 在现实生活中各种各样的事物是具体存在,而我们根据他们的很多相同的特点将它们划分为统一类,但事实上事物是具体存在的,而类只是一个概念,并没有实际存在 在程序中:务必保证先定义类,后产生对象 这与函数的使用是类似的,先定义函数,后调用函数,类也是一样的,在程序中需要先定义类,后调用类,不一样的是,调用函数会执行函数体代码返回的是函数体执行的结果,而调用类会产生对象,返回的是对象 """
总结:我们在使用面向对象编程时,第一步需要思考需要什么样的对象,这些对象我们需要它具备什么样的特征和行为,然后我们根据这些信息得出我们所需要的类型。
如何创建类和对象
#定义类的名称 class 类的名称: # 类的内容描述属性和技能 # 描述属性用变量 # 描述行为用函数 #类的名称 书写规范:首先需要见名知意,然后名称是用大驼峰命名法 #大驼峰就是单词第一个字母大写,小驼峰就是第一个字母小写
#创建对象的语法 class Person: pass #创建对象 p = Person()如何设计属性、属性的查找顺序
#总结:类和对象的定义与调用模式 class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可 self:在实例化时自动将对象/实例本身传给__init__的第一个参数
如何设计属性、属性的查找顺序
属性可以写在类中,也可以写在对象中
类中的属性是所有对象公共的,对象中的属性是每个对象独特的(不一样的)
查找顺序:“如果类中和对象中存在同样的属性,先访问对象,如果没有再访问类。
#增加属性 对象变量名称.属性名称 = 属性值 #删除属性 del 对象的变量名称.属性名称 #修改 对象.属性 = 新的值 #查看属性 访问的是对象的所有属性 print(对象.__dict__) #访问对象的类信息 print(对象.__class__)
一:我们定义的类的属性到底存到哪里了?有两种方式查看 dir(类名):查出的是一个名字列表 类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
初始化方法
__init__方法:初始化方法,本质上就是一个函数
特点1:当实例化对象时,会自动执行__init__方法。
特点2:会自动将对象作为第一个参数传入,参数名称位self,self可以是别的名字,但是不建议改。
功能:用户给对象赋初始值
class Dog: def __init__(self,kind,color,age): self.kind = kind self.color = kind self.age = age d1 = Dog(‘二哈‘,‘黑白‘,1) d2 = Dog(‘泰迪‘,‘棕色‘,2) print(d1.__dict__) # {‘kind‘: ‘二哈‘, ‘color‘: ‘二哈‘, ‘age‘: 1} print(d2.__dict__) # {‘kind‘: ‘泰迪‘, ‘color‘: ‘泰迪‘, ‘age‘: 2} #注意,该函数不能有任何返回值,只能是None
#为对象定制一个行为 #就是在类中创建一个函数 def say_hi(self): print("hello i am a student! my name:%s" % self.name) #传入self,可以在其中调用self的属性
绑定与非绑定方法
当使用对象调用该函数时会自动传入对象本身,作为第一个参数
class Student: school = "oldgirl" def __init__(self,name,age,gender): self.name = name self.age = age self.gender = gender def say_hi(self): print("hello i am a student! my name:%s" % self.name) stu1 = Student("jack",20,"male") # 使用对象调用该函数,会自动传入 stu1.say_hi() Student.say_hi(stu1) # 使用类来调用,就是一个普通函数,有几个参数就传几个
类绑定方法
class OldBoyStudent: school = "oldboy" def __init__(self,name): self.name = name @classmethod def show_school(cls): print(cls) OldBoyStudent.show_school() # <class ‘__main__.OldBoyStudent‘> print(OldBoyStudent) # <class ‘__main__.OldBoyStudent‘>
语法:@staticmethod
@staticmethod def print_hello(): print("hello world")