面向对象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__构造器函数传入对应的实参。
如何使用类和对象
类的作用
- 实例化产生对象
- 属性引用
类具有数据属性和函数属性。在类的名称空间中,存放着类中定义的变量名和函数名,通过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这个参数传进去。
阅读全文
1 0
- [oop] 面向对象由浅入深
- 面向对象(OOP)
- OOP 面向对象系列
- 面向对象 OOP 解释
- 面向对象 --OOP
- 面向对象编程(OOP)
- 面向对象笔记(OOP)
- 面向对象 java oop
- OOP--面向对象编程
- OOP面向对象编程
- 面向对象oop
- OOP 面向对象编程
- oop面向对象
- 面向对象 oop
- C++ OOP面向对象
- OOP:面向对象编程
- 面向对象(OOP)笔记
- OOP-面向对象编程
- Android完整性校验
- 润乾v5自定义配色方案
- 梯度下降与delta法则
- fetchsize of JDBC
- ruby
- 面向对象OOP
- Linux使用jstat命令查看jvm的GC情况
- 基于Token的WEB后台认证机制
- POJ 1584[A Round Peg in a Ground Hole]题解
- linux 使用记录
- 谈谈自己,说说未来
- Struts2笔记08 获取值栈对象
- Android异常一、异步任务导致的窗口句柄泄漏问题(内存泄漏)
- Android共享元素场景切换动画的实现