面向对象设计(OOP)
面向过程与面向对象
面向过程:
根据业务逻辑从上到下写代码
面向对象:
面向对象是向现实世界模型的延伸, 任何物体都可以归为一类事物, 这类事物可以有很多方法和属性, 每一个个体都是一类事物的实例.
面向对象有三大特性, 封装, 继承和多态
封装就是将一类事物属性和行为抽象成一个类, 使其属性私有化, 行为公开化, 提高数据隐秘性, 使代码模块话, 这样使得代码复用性很高
继承就是进一步将一类事物公有的属性和行为抽象成一份父类, 子类可以继承父类的方法和属性, 也有自己特有的方法和属性, 这样做扩展了已存在的代码, 进一步提高了代码的复用性.
多态就是继承父类的方法后可以修改父类的方法, 就是鸭子类型, 看起来像鸭子, 走起来像鸭子,那它就是鸭子.
Python的类
python2与python3中新式类和经典类的区别
Python3 里如果一个类没有写父类,则默认继承object。 继承的这个object就是新式类
Python2 里如果一个类写了继承 object 则是 新式类,如果没写父类则是 经典类
重写父类
当子类重写了父类的方法后,有三种方法可以在子类调用父类的属性和方法
父类名.方法名(self,xxx,xxx,xxx,...)
- Animal.init(self)
super().方法名(xx,xx,xx),注意,参数里不需要传 self。只在 python3 可用
- super().init()
super(子类名, 子类对象).方法名(xx,xx,xxx)
- super(Cat, self).init()
静态方法和类方法
静态方法:
不需要定义实例就可以使用这个方法.
定义方法事需要在函数前面加上@staticmethod标记符
类方法:
定义类方法需要在函数前加上@classmethod
cls代表类对象本身
类方法可以通过类或其他实例来调用该方法
__new__
方法
在实例化对象的时候, 在调用初始化函数之前, 先调用了
__new__()
方法
__new__
方法必须要返回一个实例化的对象
__new__
至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供继承自object的新式类才有
__new__
如果将类比喻为工厂,那么init()方法则是该工厂的生产工人,init()方法接受的初始化参 数则是生产所需原料,init()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而 new()则是生产部经理,new()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出 货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。
单例模式
单例模式是一种常见的设计模式, 主要目的是确保某个类只有一个实例存在
实现单例模式的几种方法:
class Person(object): instance = None # 定义一个类属性 instance,用来记录第一次创建的对象 def __new__(cls, *args, **kwargs): if cls.instance == None: # 还没有创建第一个对象 cls.instance = object.__new__(cls) # 使用类属性来引用创建的第一个对象 return cls.instance def __init__(self, name): self.name = name
单例模式
单例模式是一种常见的设计模式, 主要目的是确保某个类只有一个实例存在
实现单例模式的几种方法:
class Person(object): instance = None # 定义一个类属性 instance,用来记录第一次创建的对象 def __new__(cls, *args, **kwargs): if cls.instance == None: # 还没有创建第一个对象 cls.instance = object.__new__(cls) # 使用类属性来引用创建的第一个对象 return cls.instance def __init__(self, name): self.name = name
异常处理
异常
当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"
捕获异常
try: except:
- try语句中放入可能产生错误的代码
- except语句中放入处理错误的代码
捕捉指定异常
语法:except 异常名
一次性捕捉多个异常
语法: except (异常1, 异常2,..)
捕捉任意异常
except Exception:
Python 里大部分的异常都是 Exception 的子类,所以都可以使用 Exception 来捕捉
通过别名获取异常信息
单个
except 异常名 as 别名
多个
except (变量1, 变量2,..) as exp
异常else,finally
如果没有捕获到异常,那么就执行else中的事情
在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。
异常的传递
如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递
简单来说就是由内向外
自定义异常
数据类型
可变数据类型
列表和字典
修改时,内存地址不发送改变
不可变数据类型
数字,字符串,元组
修改时,内存地址发生改变
匿名函数
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤
语法格式: lambda [arg1 [,arg2,.....argn]]:expression
评论 (0)