1.什么是面向对象
面向对象是一种编程思想,是前辈们总结出的经验,指导程序员如何编写出更好的程序 ,
核心是对象,程序是一系列对象的集合, 程序员负责调度控制这些对象来交互着完成任务:
优点:
1,扩展性 2,灵活性 3,重用性
缺点
2.无法准确预知结果
使用场景
对扩展性要求较高的,面向用户的
2.面向过程编程思想
关注的核心是过程,过程是就是一步一步的执行步骤,既先干啥在干啥
优点
逻辑清晰,复杂问题流程化,进而简单化
缺点
扩展性差,可维护性差
使用场景
对扩展要求较低的程序,如系统内核
不是所有程序都要面向对象,得分析具体需求
类: 类型,是一种抽象概念,是一系列具备相同特征和相同行为的对象集合
对象:具体存在的某个事物,具备自己的特征和行为,对象就是特征和技能的结合体
类和对象的关系:类包含一系列对象,对象属于类,它们都打印出来的不是一个单词,通过点方法来获得属性名
在生活中是先有对象再有类,而在程序中是先有类才能有对象,我们必须先告诉计算机这类的对象有什么特征有什么行为
总结出一个结论:在使用面向对象编程时,第一步就是思考需要什么样的对象,对象具备什么样的特征和行为,从而根据 这些信息总结出需要的类型
3.创建类和对象
定义类的语法
class 类的名称: #类中的内容 描述属性和技能 #描述属性用变量 #描述行为用函数 #类名称 书写规范 首先是见名知意 名称是大驼峰命名法 #驼峰就是单词首字母大写 , 大驼峰是第一个字母大写,小驼峰是第一个字母小写 创建对象的语法 class Person: pass p = Person() # 创建对象 class Student: pass stu = Student() # 创建对象的语法 调用类 既类名加括号 print(stu) # <__main__.Student object at 0x0000022224667A20> print(Student) # <class '__main__.Student'>
属性的写法: 属性可以写在类中, 类中的属性, 所有对象公共的
可以写在对象中,对象中的属性,是每一个对象独有的
如果类和对象中存在同样的属性,先访问对象,如果没有,在访问类
练习: 描述一个老师类 需要包含 一个公共属性和 一个独特的属性 class Teacher: school = 'oldboy' t1 = Teacher() t1.name = 'jack' t1.age = 18
属性的增删改查 属性增加 对象变量名.属性名称 = 属性值 删除属性 del 对象变量名称.属性名称 修改 对象.属性 = 新的值 查看属性 访问的是对象的所有属性 print(对象.__dict__) 访问对象的类信息 print(对象.__class__)
class Person: desc = '吃饭' print('class run...') p1 = Person() p1.name = '王五' print(p1.name) # 王五 print(p1.__dict__) # {'name': '王五'} print(p1.__class__) # <class '__main__.Person'>
print(p1.__class__.__name__) # Person print(Person.__dict__) # {'__module__': '__main__', 'desc': '吃饭', '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
init方法: 叫做初始化方法,本质是 一个函数
特点1:当实例化对象时,会自动执行init方法
特点2:会自动将对象作为第一个参数传入,参数名称位self, self可以是别的名字,但不建议改
功能:用户给对象赋初始值
class Teacher: school = 'oldboy' def __init__(self,name,age): print(self) # <__main__.Teacher object at 0x0000013A207C7C88> self.name = name self.age = age t1 = Teacher('jack',18) print(t1.name) # jack print(t1) # <__main__.Teacher object at 0x0000013A207C7C88>
对象的精髓在于将数据和处理数据的函数整合到一起,这样一来拿到一个对象就同时拿到了需要处理的数据以及处理数据的函数
5.对象的绑定方法
默认情况下类中的方法都是对象绑定的方法
其特殊意义之处在于,当使用对象调用该函数时,会自动传入对象本身,作为第一个参数,
当使用类名来调用时,他就是一个普通的函数,有几个参数就传几个
class Student: school = 'oldboy' 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') stu2 = Student('rose',18,'female') stu1.say_hi() # hello,i am a student! my name:jack stu2.say_hi() # hello,i am a student! my name:rose print(stu1) # <__main__.Student object at 0x00000180431BD550> print(type(Student.say_hi)) # <class 'function'>
Student.say_hi(stu1) # hello,i am a student! my name:jack print(type(stu1.say_hi)) # <class 'method'>
类绑定方法
类绑定方法用@classmethod来装饰
特殊之处:不管用类还是对象调用,都会传入类本身,作为第一参数
什么时候绑定给对象:当函数逻辑需要访问对象中的数据时
什么时候绑定给类:当函数逻辑需要访问类中的数据时
class BaseClass: @classmethod def get_obj(cls): print(cls) class Admin(BaseClass): def __init__(self,name,pwd): self.name = name self.pwd = pwd res = Admin('jack','123') res.get_obj() #<class '__main__.Admin'>
非绑定方法
或叫做静态方法,即不需要访问类的数据,也不需要访问对象的数据
语法:@staticmethod
class OldBoyStudent: school = 'oldboy' def __init__(self,name): self.name = name @classmethod def show_school(cls): print(cls) @staticmethod def print_hello(): print('hello world') OldBoyStudent.show_school() # <class '__main__.OldBoyStudent'> stu = OldBoyStudent('jack') OldBoyStudent.print_hello() # hello world stu.print_hello() # hello world
import os import pickle import time class Student: def __init__(self,name): self.name = name def say_hi(self): print('name:',self.name) def save(self): with open(self.name,'wb') as f: pickle.dump(self,f) @staticmethod def get(name): with open (name,'rb') as f: obj = pickle.load(f) return obj stu = Student('rose') stu.save() obj = Student.get('rose') print(obj.name) #rose print(Student,__name__) # <class '__main__.Student'> __main__