专栏首页抠抠空间面对对象总结

面对对象总结

一、类

1、类的定义

1 class 类名:
2     类属性
3     类方法

如:

1 class Person:
2     kind = '人类'
3     def eat(self):
4         print('我会吃饭')

2、类的属性

在类的内部定义的属性,与类的方法平级。类的属性是属于类全局的,可以用  类名.属性名  调用,也可以用  类的实例化对象.属性名  调用,如下:

1 class Person:
2     kind = '人类'
3     def eat(self):
4         print('我会吃饭')
5 
6 p = Person()
7 print(Person.kind)
8 print(p.kind)

3、类的方法

在类的内部定义的方法,与类的方法平级。可以用  类名.函数名  调用,也可以用  类的实例化对象.函数名  调用,如下:

① __init__( )方法

   __init__( ) 方法会在类实例化的时候自动被调用。

1 class Person:
2     kind = '人类'
3     def __init__(self,name,age):
4         print('实例化的时候此函数会被执行!')
5 p = Person('付勇',18)

② 普通方法

1 class Person:
2     def eat(self):
3         print('我会吃饭')
4 
5 p = Person()
6 p.eat()

4、实例化类的对象

实例化对象名 = 类名(参数1,参数2,参数3....)

5、类的其他方法

dir(类名):查出的是一个包含类的各个方法的列表

类名.__dict__:查出的是一个字典,key为属性名,value为属性值

类名.__name__:类的名字(字符串)

类名.__base__: 类的第一个父类(在讲继承时会讲)

类名.__bases__ :  类所有父类构成的元组

类名.__module__ : 类定义所在的模块

二、面向对象三大特性

1、继承

继承的定义:

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

继承的分类:

①单继承:class B(A):pass

②多继承:class C(B,A...)

继承的作用:

① 减少代码的重用 ② 提高代码可读性 ③ 规范编程模式

如何查看继承至哪些类:

① 类名.__base__或者 类名.__bases__

② 如果没有基类,那么默认继承object类

派生:

当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。

接口类:

① 声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

② 可以通过abc模块来限制子类必须要有接口类的方法  

1 from abc import ABCMeta,abstractmethod
2 class A(metaclass=ABCMeta):
3     @abstractmethod
4     def func1(self):pass

抽象类:

① 抽象类是一个介于类和接口之间的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计  在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念。

② 抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。

继承类的查找顺序:

① 经典类(没有继承object对象的类)

多继承情况下,按照深度优先进行查找

② 新式类(继承了object对象的类(python3中所有类都是新式类))

多继承情况下,按照广度优先来查找

继承的原理:

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表

2、多态

多态的概念

多态指的是一类事物有多种形态,动物有多种形态:人,狗,猪

多态性

在继承的状态下,不同的子类调用父类的统一个方法会有不同的结果

鸭子类型

在不依赖继承的情况下,两个类的方法以及属性名自觉遵循一致的原则,就叫鸭子类型。如列表和元组

3、封装

封装的定义

隐藏对象的属性和实现细节,仅对外提供公共访问方式。

封装的好处

1. 将变化隔离;  2. 便于使用; 3. 提高复用性;  4. 提高安全性;

封装的原则

  1. 将不需要对外提供的内容都隐藏起来;   2. 把属性都隐藏,提供公共方法对其访问。

封装的分类

①私有属性

__属性名 = 属性值

只能在内部被调用,self.__属性名

②私有方法

def __func(self,参数):pass

只能在内部被调用,self.__方法名(参数)

③私有实现的原理

其实只是python将私有属性改了一下名字,可以通过 类名._类名__属性名  来进行访问,但是不要这样做

静态属性

一个静态属性property本质就是实现了get,set,delete三种方法

 1 class Foo:
 2     @property
 3     def AAA(self):
 4         print('get的时候运行我啊')
 5     @AAA.setter
 6     def AAA(self,value):
 7         print('set的时候运行我啊')
 8     @AAA.deleter
 9     def AAA(self):
10         print('delete的时候运行我啊')
11 #只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
12 f1=Foo()
13 f1.AAA #get的时候运行我啊
14 f1.AAA='aaa' #set的时候运行我啊
15 del f1.AAA #delete的时候运行我啊

 三、isinstance和issubclass

isinstance(obj,cls)检查是否obj是否是类 cls 的对象

class Foo(object):
     pass
  
obj = Foo()
  
isinstance(obj, Foo)

issubclass(sub, super)检查sub类是否是 super 类的派生类

class Foo(object):
    pass
 
class Bar(Foo):
    pass
 
issubclass(Bar, Foo)

四、反射

参照本人写的另一篇博客:http://www.cnblogs.com/fu-yong/p/8330979.html

五、面向对象常用术语

抽象/实现

抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现这种模型。抽象不仅包括这种模型的数据属性,还定义了这些数据的接口。

对某种抽象的实现就是对此数据及与之相关接口的现实化(realization)。现实化这个过程对于客户 程序应当是透明而且无关的。 

封装/接口

封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数。通过任何客户端直接对数据的访问,无视接口,与封装性都是背道而驰的,除非程序员允许这些操作。作为实现的 一部分,客户端根本就不需要知道在封装之后,数据属性是如何组织的。在Python中,所有的类属性都是公开的,但名字可能被“混淆”了,以阻止未经授权的访问,但仅此而已,再没有其他预防措施了。这就需要在设计时,对数据提供相应的接口,以免客户程序通过不规范的操作来存取封装的数据属性。

注意:封装绝不是等于“把不想让别人看到、以后可能修改的东西用private隐藏起来”

真正的封装是,经过深入的思考,做出良好的抽象,给出“完整且最小”的接口,并使得内部细节可以对外透明

(注意:对外透明的意思是外部调用者可以顺利的得到自己想要的任何功能,完全意识不到内部细节的存在)

合成

合成扩充了对类的 述,使得多个不同的类合成为一个大的类,来解决现实问题。合成 述了 一个异常复杂的系统,比如一个类由其它类组成,更小的组件也可能是其它的类,数据属性及行为, 所有这些合在一起,彼此是“有一个”的关系。

派生/继承/继承结构

派生描述了子类衍生出新的特性,新类保留已存类类型中所有需要的数据和行为,但允许修改或者其它的自定义操作,都不会修改原类的定义。 继承描述了子类属性从祖先类继承这样一种方式 继承结构表示多“代”派生,可以述成一个“族谱”,连续的子类,与祖先类都有关系。

泛化/特化

基于继承 泛化表示所有子类与其父类及祖先类有一样的特点。 特化描述所有子类的自定义,也就是,什么属性让它与其祖先类不同。

多态与多态性

多态指的是同一种事物的多种状态:水这种事物有多种不同的状态:冰,水蒸气

多态性的概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不需考虑他们具体的类。

冰,水蒸气,都继承于水,它们都有一个同名的方法就是变成云,但是冰.变云(),与水蒸气.变云()是截然不同的过程,虽然调用的方法都一样

自省/反射

自省也称作反射,这个性质展示了某对象是如何在运行期取得自身信息的。如果传一个对象给你,你可以查出它有什么能力,这是一项强大的特性。如果Python不支持某种形式的自省功能,dir和type内建函数,将很难正常工作。还有那些特殊属性,像__dict__,__name__及__doc__

 六、面向对象思维导图

(右键新窗口打开可查看原图)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一个简单的rest_framework demo

    人生不如戏
  • Django之ModelForm

    人生不如戏
  • python模块之PIL模块(生成随机验证码图片)

    PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块。主要的类包括Image,ImageFont,ImageDra...

    人生不如戏
  • win10 uwp 依赖属性

    本文告诉大家如何使用依赖属性,包括在 UWP 和 WPF 如何使用。 本文不会告诉大家依赖属性的好处,只是简单告诉大家如何使用。

    林德熙
  • <area>标签

    <area> 标签定义图片映射中的区域(注:图像映射指得是带有可点击区域的图像)。<area>元素总是嵌套在 <map> 元素中。

    Html5知典
  • Angular动态创建元素的一些坑

    或者直接对对象的onclick属性 绑定方法 ,此种做法可以使用父级this上的方法

    lilugirl
  • Selenium2+python自动化73-定位的坑:class属性有空格

    前言 有些class属性中间有空格,如果直接复制过来定位是会报错的InvalidSelectorException: Message: The given s...

    上海-悠悠
  • 矩阵的奇异值分解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    于小勇
  • 从源码来理解slf4j的绑定,以及logback对配置文件的加载

      项目中的日志系统使用的是slf4j + logback。slf4j作为一个简单日志门面,为各种loging APIs(像java.util.logging,...

  • 用不同姿势复现 CVE-2018-8174 漏洞

    日前,360 核心安全事业部高级威胁应对团队在全球范围内率先监控到了一例使用 0day 漏洞的 APT 攻击,捕获到了全球首例利用浏览器 0day 漏洞的新型 ...

    信安之路

扫码关注云+社区

领取腾讯云代金券