面向对象学习 目录: 1.面向对象介绍 2.为什么要用面向对象 3.面向对象的特性:封装、集成、多态 4.如何写出面向对象的程序:领域建模 5.面向对象高阶语法: A.经典类、新式类 B.静态方法、类方法、属性方法 C.类的特殊方法 D.反射 6.作业 7.感悟ending 内容: 1.面向对象介绍 编程:计算机语言py+算法+数据结构,根据任务设计代码得到预期的结果 条条大路通罗马,实现任务有不同种方法,对这些编程特点归纳总结得到的编程方式,即为编程范式。 编程范式:面向过程编程和面向对象编程 面向过程编程: 概念:从上到下编程,一步一步,从头到尾解决问题 优点:适合简单的脚本,做一些一次性的任务 缺点:需要迭代和维护的程序,修改涉及到的方方面面太多,还是面向对象最方便 面向对象编程OOP: OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一 方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于 面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。 2.为什么要用面向对象? 3.面向对象的特性:封装、继承、多态 封装:在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法 继承:一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承;由一般到特殊的过程 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 多态:多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在 继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。 严格来说,python不支持多态 4.如何写出面向对象的程序 OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。 领域建模的三字经方法:找名词、加属性、连关系 5.面向对象高阶语法: A.经典类、新式类 区别:01.写法不同 class A:pass class A(object):pass 02.多重继承搜索顺序不同 分别是深度优先DFS 广度优先BFS 03.新式类增加了slot属性,__slots__属性虽然令实例失去了绑定任意属性的便利,但是因为每一个实例没有 __dict__属性,却能有效节省每一个实例的内存消耗,有利于生成小而精干的实例。 B.静态方法、类方法、属性方法: 代码01: # -*- coding:utf-8 -*- class Data(object): def __init__(self,year,month,day): self.year = year self.month = month self.day = day @classmethod def from_string(cls,data_as_string): f = lambda x:int(x) y,m,d = map(f,data_as_string.split('-')) data1 = cls(y,m,d) return data1 @staticmethod def is_data_vaild(data_as_string): f = lambda x: int(x) y, m, d = map(f, data_as_string.split('-')) return d<=31 and m<=12 and y<=3999 data2 = Data.from_string('2018-11-12') is_data = Data.is_data_vaild('2018-11-12') print data2,is_data 代码02: # -*- coding:utf-8 -*- class Kls(object): def __init__(self, data): self.data = data def printd(self): print(self.data) @staticmethod def smethod(*arg): print('Static:', arg) @classmethod def cmethod(*arg): print('Class:', arg) ik = Kls(23) ik.printd() #23 实例方法,无需赘述 ik.smethod() #('Static:', ()) 静态方法,经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法. ik.cmethod() #('Class:', (<class '__main__.Kls'>,)) 仅仅与类交互,而不是和实例交互的方法 Kls.printd() #TypeError: unbound method printd() must be called with Kls instance as first argument (got nothing instead) Kls.smethod() #('Static:', ()) Kls.cmethod() #('Class:', (<class '__main__.Kls'>,)) 参考01:https://www.zhihu.com/question/20021164/answer/18224953 总结:实例方法;类方法:第一个参数是类;静态方法:啥也不传递,不能访问类也不能访问实例 参考02:https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner/12179752#12179752 A:init方法,即实例方法,实例化了该类having the first non-optional argument (self) that holds a reference to a newly created instance. B:此处用的是classmethod,被它修饰的函数第一个参数必须是cls,即类。该方法和类有关系但是和实例无关。此处想由外界数据初始化一堆Data类, 我们可以外边定义一个from_string方法,C++中叫重载,即根据不同数据创造不同的对象(此处不理解),python中通过staticmethod实现。这样有三个好处。 ~代码复用~封装~cls是一个保存类本身的对象,而不是类的实例。这样实现继承也没问题! C:staticmethod装饰器的第一个参数It's pretty similar to classmethod but doesn't take any obligatory parameters (like a class method or instance method does). 也就是说他其实和类、实例没关系,但是还稍微有那么一点儿关系。比如写代码中check一下数据的合法性,什么开关是否处于开启状态。just a function,无法访问类和实例的东西。 参考03:https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner/14605349#14605349 补充了个JB啊,反正就是额外的构造用classmethod C.类的特殊方法 property属性方法 代码: class Kls(object): def __init__(self, data): self.data = data @property def eat(self): print 'i am eating' ik = Kls(23) ik.eat 作用:把一个方法变成静态属性有什么卵用呢?既然想要静态变量,那直接定义成一个静态变量不就得了么?well, 以后你会需到很多场景是不能简单通过 定义 静态属性来实现的, 比如 ,你想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了。因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过 一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以,明白 了么? 修改property属性: @property.setter装饰器再装饰一下 @propertydeleter, 是允许可以将这个属性删除 01. __doc__ 表示类的描述信息 02.__module__ 表示当前操作的对象在那个模块 03.__class__ 表示当前操作的对象的类是什么 04.__init__ 构造方法,通过类创建对象时,自动触发执行 05.__del__ 析构方法,当对象在内存中被释放时,自动触发执行。 06. __call__ 对象后面加括号,触发执行 07.__dict__ 查看类或对象中的所有成员 08.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。 09.__getitem__、__setitem__、__delitem__用于索引操作,如字典。以上分别表示获取、设置、删除数据 10.__new__ __metaclass__ 学习:参考https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python 总结:A.metaclass就是类的类,定义了如何定义类;就像class定义实例一样。创建类的流程就是:如果有metaclass参数(类、父类、模块中进行查找),则按照metaclass定义的创建类的 方法进行创建,metaclass参数的值一般是type或者子例化type的类。99%的程序员不用知道他用来干啥。 B.new和init到底是干啥的?都是用来创建实例的,一般不用,单例模式会使用到。 概念:class instance metaclass type D.反射 学习:hasattr getattr setattr delattr 总结:前两个判断并取值,其他的用到了再说吧...... 6.作业01:参考https://www.cnblogs.com/heaven-xi/p/9703823.html 7.总结:好好学习,天天向上;纯理论基础是基石