面向对象基础
一 、面向对象编程思想(oop)
什么是面向对象编程
面向对象编程 ------ Object Oriented Programming ,简称OOP,是一种程序设计思想
它将对象作为程序的基本单元
将数据和处理数据的程序封装到对象中
以提高软件的重要性,灵活性和扩展性为首要目的
面向对象编程的优缺点:
优点
1.大大提高了扩展性,当一个对象发了修改时,对其他对象没有任何影响,对象之间相互独立,耦合度变得更低
2.大大提高了程序的灵活性
3.重用性
缺点:
1.程序的复杂度提高了
2.无法准确预知结果
应用场景
对扩展性要求较高的程序,通常是直接面向用户的,比如:QQ,微信
面向过程编程思想
关注的核心是过程,过程是一步一步的执行步骤,就是首先做什么再做什么
优点:逻辑清晰,复杂问题简单化,流程化
缺点:扩展性差,可维护性差
使用场景:
对扩展性要求较低的程序,比如:系统内核,计算器,git
二、类与对象
对象是什么
对象是特征和技能的结合体,具备自己的特征和行为
对象的另一种理解方式:
变量的作用是存储数据,函数的作用是处理数据
对象是将数据与处理数据的函数绑定在一起
类是什么
类就是类型,类别,种类,是一系列对象中相似特征与技能的结合体
在生活中是一种抽象的概念,例如:人类,动物是不具体的
三、创建类和对象
定义类
以学生类Student为例子,在Python中,定义类通过class关键字
class Student: pass
class后面紧跟的就是类名,即Student,遵循python编码规范,类名通常是大写开头的单词,多个单词是使用驼峰命名法
创建对象也称之为实例化,定义好student类后,就可以根据Student类创建Student的实例,创建实例通过类名加上()实现:
stu1 = Student() print (stu1) #<__main__.Student object at 0x000001E2E15485F8>
变量名stu1指向一个Student类的实例,0x000001E2E15485F8是实例的内存地址,
每个实例的地址都是不相同的
print(Student) #<class '__main__.Student'>
Student本身则是一个类(class)
属性的写法:
属性可以写在类中,类中的属性,是所有对象公共的
也可以写在对象中,对象中的属性,是每个对象独特的(不一样)
如果类中和对象中存在同样的属性,先访问对象,如果没有在访问类
属性的增删查改
1.增加属性
对象变量名称.属性名称 = 属性值
2.删除属性
del 对象的变量名称.属性名称
3.修改属性
对象.属性 = 新的值
4.查看属性
print(对象.__dict__) 访问的是对象的所有属性
print(对象.__class__) 访问对象的类信息
四、初始化方法init
class Student: def __init__(self,name): self.name = name
t1 = Student('jack')
print(t1.name) # <__main__.Student object at 0x000002447EDD8B70>
print(t1) #jack
小结:
init函数用于为对象属性设置初始值
在创建对象时会自动调用
自动传入对象本事
五、为对象定制行为
class Student: def __init__(self,name,age): self.name = name self.age = age def say_hi(self): print("hello ! my name is %s"%self.name) stu1 = Student('yzy',18) stu1.say_hi()
六、绑定类方法
默认情况下类中的方法都是对象绑定方法
其特殊支出在于:
当使用对象调用该函数是会自动传入对象本身,作为第一个参数
当使用类名来调用时,它就是一个普通函数,有几个参数就得传几个参数
类的绑定方法
类的绑定方法用@classmethod来装饰
特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数
什么时候绑定给对象:当函数逻辑需要访问对象中的数据时
什么时候绑定给类:当函数逻辑需要访问类中的数据时
非绑定方法
@staticmethod
也称为静态方法,就是即不需访问类的数据,也不需要访问对象中的数据
不常用
class Student: school = "oldboy" def __init__(self,name): self.name = name @classmethod def show_school(cls): print(cls) @staticmethod def print_hello(): print("hello world") stu = Student("jack")
绑定到类的方法与绑定到对象的方法总结
异同点
相同
绑定对象调用时都有自动传参的效果
绑定到谁给谁就由谁来调用
不同
绑定到类的方法自动传入当前类
绑定到对象的方法自动传入当前对象