面向对象OOP

来源:互联网 发布:ktv网络点歌系统 编辑:程序博客网 时间:2024/06/05 21:04

面向过程:
核心是过程,过程就是解决问题的步骤,基于该思想设计程序就像在设计一条流水线,是一种机械式思维。cpu就是面向过程的。
优点:复杂的问题简单化,流程化
缺点:扩展性差

面向对象:
理解python中的面向对象,上帝视角:所有存在的都是对象,所有不存在的,也可以造出来。
OOP的优点:可扩展性,对类的修改会立刻反映到对象身上。
在现实生活中:先有对象,再抽象出类。在python中先定义类,再创建对象。
对象:特征与技能的结合体
类:一些对象中共同的特征与技能的集合体。

程序最终执行时都是面向过程的。

定义类和创建实例

定义一个类

class Teacher():    # 关键字class跟类名(首字母大写)。应该将类定义在模块的顶层,以便实例能够顺利创建。    school = 'oldboy'   # 相当于共有的特征    print('测试是否执行') # 直接运行,会打印出这句话,因此,定义一个类时,是有执行效果的。    def __init__(self, name, age):  # 实例化时,赋予对象独有的特征。        if not isinstance(name, str):   # 构造器函数里面其实可以加任何可执行代码            raise TypeError     # 这里是判断用户输入,如果不是字符串,就人为的抛一个错误。        self.name = name    # self.name,代表对象有name(可以是任意名字)这个特征,其值由函数的name参数传入。        self.age = age  # self只是习惯命名,其实换成任意变量名都行,比如 x        print('initialized')    def teach(self):    # 相当于共有的技能        print('%s is good at teaching' % self.name)

由于OOP的可扩展性,我们在定义一个类时,不必绞尽脑汁的一次就定义好所有的属性,后期再慢慢加,提高了开发的效率。

创建类的实例(对象)

egon = Teacher('Egon',18)# 类名加括号运行,给__init__构造器函数传入对应的实参。

如何使用类和对象

类的作用

  1. 实例化产生对象
  2. 属性引用
    类具有数据属性和函数属性。在类的名称空间中,存放着类中定义的变量名和函数名,通过ClassName.__dict__可以访问类的名称空间,是字典形式存放的名称和其对应的值。ClassName.变量名/函数名,可以查看相关属性。注意,类调用自己的函数属性时,就是一个普通函数,需要为所有的形参传递对应的实参,包括第一个形参self。

对象

对象也有自己的名称空间,可以通过ObjName.__dict__查看,其中仅存放着该对象特有的属性,而共有属性可以从类的名称空间中引用。对象可以引用类的数据属性。当对象自己定义的数据属性与类属性重名时,并不会修改类属性,而是在对象自己的名称空间创建该属性。因此,访问对象的数据属性时,先从对象自己的名称空间去找,如果找不到,再去类的名称空间去找。

class A():    li = []    def __init__(self):        self.li.append(self)    # 实例化对象后,执行init函数,        # 对象找自己名称空间的li,找不到,去类的名称空间找到了,li是可变类型,        # 添加了元素后,id和类型没变,实例并没有修改类中的数据属性。        A.li.append(self)a = A()b = A()print(a.li) # 打印结果,li中有四个对象,说明并没创建对象的li

注意,对象本身并没有函数属性:

print(Teacher.teach)# >>> <function Teacher.teach at 0x00000265FCB771E0>print(egon.teach)# >>> <bound method Teacher.teach of <__main__.Teacher object at 0x00000265FC52B6A0>># 可以看到,类在调用类函数属性时,就是一个普通函数,而对象在调用类的函数属性时,是该对象的绑定方法,二者的内存地址也是不一样的(且每个对象的绑定方法都不一样)

绑定方法绑定谁,操作的就是谁,而且自动把调用者当参数传入。__init__构造器函数是对象创建后调用的第一个类的函数属性,也就是该对象的绑定方法,因此第一个参数self是自动传值。而类在调用类函数属性时,就是一个普通的函数,需要给该函数的所有形参一一传值。

python统一了类型和类,创建一个类,就是一个类型。

print(type(egon))# >>> <class '__main__.Teacher'> 可以看到对象的类型就是类print(type(Teacher))# >>> <class 'type'>
li = [1,2,3]    # 就相当于li = list([1,2,3]) 创建类list的对象。li.append(4) # 就相当于 list.append(li,4),只不过append是li的绑定方法,因此不需要传入第一个参数。# 而如果通过类list来调用append函数,就需要将li这个参数传进去。
原创粉丝点击