day6-面向对象编程
1. 面向对象和面向过程:
·面向过程编程(Procedural Programming)---Procedural programming uses a list of instructions to tell the computer what to do step-by-step.
面向过程编程依赖 procedures,一个procedure包含一组要被进行计算的步骤, 面向过程又被称为top-down languages, 就是程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题 。基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继续分解直到小问题足够简单到可以在一个小步骤范围内解决。
·面向对象编程(Object Oriented Programming):
OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,程序的作用是为了高效和方便的解决日常瞬息万变的问题,所以有两个原则:·尽量少的重复代码;·代码经常变更;看到 重复代码你肯定会想到函数式编程,函数编程与OOP的主要区别就是OOP可以使程序更加容易扩展和易更改。--此处有疑问,先保留(结论毋庸置疑,手动狗头);
面向对象的几个核心特性如下
Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
Polymorphism 多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。
对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定
2. 面向过程:
class SchoolMember(object):
a=1 #类属性
b=2
def __init__(self,name,age):#构造函数 self.name = name self.age = age def tell_sth(self): print("talk about anything!!")
实例化过程,__init__和其他方法;
`构造函数,实例化过程中做一些类的实例化工作;实例变量(静态属性)作用域是实例本身;
·类方法,动态属性;--所有实例化的类对象共享,节省内存空间,
·实例变量的优先级比较低;
·修改类变量的时候,如果变量是字符串,数字,则实例会重新创建,如果是列表,字典等,则是用的类的地址;
·实例化类变量的过程,调用SchoolMember,比如r2 = SchoolMember(‘Jack’,18) 实际上是把(r2,‘Jack’,18)传给SchoolMember了,然后开辟一块内存地址进行保存;——实例化只保存了__init__(构造函数)中的属性;方法还是保存在Role中,需要的时候再进行调用;
·析构函数:在对象被销毁前自动调用,例如__del__;
·Python中使用引用计数的方法实现垃圾回收,当一个对象被引用一次时,计数加一,被释放一次时,计数减一。当计数器为0时,计算机则收回这些内存并释放。
·私有属性,私有方法;在名称前面添加__,外部无法访问,只能class内部访问操作;
`@staticmethod,不能使用类属性和实例属性,self变成一个变量;
`@classmethod,只能使用类属性;
`@property,将方法变成属性;
3. 特殊成员用法:
·__doc__ 描述类介绍信息;(‘’‘这个类描述学校成员类型’‘’)
·__module__ 和 __class__
__module__ 表示当前操作的对象在那个模块
__class__ 表示当前操作的对象的类是什么
·__call__ 对象后面加括号,触发执行。即:对象() 或者 类()()
·__dict__ 查看类或对象中的所有成员
·__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
·__getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分别表示获取、设置、删除数据
·__new__ \ __metaclass__ 所有的类都衍生于type类;__metaclass__,其用来表示该类由 谁 来实例化创建,类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__
4. 反射:有时候我们需要判断某个类是否包含某个属性或者方法,如果有调用这个方法,或者修改/删除这个方法,那么此时反射就是一把利器;先使用hasattr(obj,str)判断是否存在,存在的话使用getattr(obj,str)来获取这个方法,或者使用settattr(obj,str,v)/delattr(obj,str)修改和删除;importlib可以用于动态导入模块;
import importlib __import__('import_lib.metaclass') #这是解释器自己内部用的—这个导入的是import_lib #importlib.import_module('import_lib.metaclass') #与上面这句效果不一样,官方建议用这个—这个导入的是import_lib.metaclass
5.异常处理:
Try: Code Except ioerror as e: Print() Except exception as e: Print() Else: 一切正常; Finally: 不管怎样都执行; AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型

浙公网安备 33010602011771号