Python面向对象基础

语言分类

面向机器

抽象成机器指令,让机器容易理解

代表:汇编语言

面向过程

按照步骤一步一步走,若出现情况A做相应的处理,若出现情况B做相应的处理

问题规模小,可以步骤化,按部就班处理

代表:C

面向对象OOP

计算机需要处理的问题的规模越来越大,需要多人、多部门协作

代表:C++、Java、Python

面向对象

一种认识世界、分析世界的方法论。将万事万物抽象成类

类class

抽象的概念,世间万物的抽象,是一类事物的共同特征的集合

用计算机语言来描述类——属性和方法的集合

对象instance、object

对象是类的具象,是一个实体

每个人个体都是抽象概念人类的不同的实体

属性:是对象状态的抽象,用数据结构来描述

操作:是对象行为的抽象,用操作名和实现该操作的方法类描述

 
 

哲学思想

一切皆对象

对象是数据和操作的封装

对象是独立的,但相互之间可以相互操作

目前OOP是最接近人类认知的编程范式

面向对象的3要素

封装

组装:将数据和操作结合在一起

隐藏数据:对外只暴露一些接口,通过接口来访问对象

继承

多复用,继承来的不用在重复写

多继承少修改,OCP(Open-Closed Principle),使用继承来改变和体现个性

多态

动态绑定,面向对象编程最灵活的地方

Python的类

定义

class ClassName:

语句块

使用class关键字

类名必须使用大驼峰

类定义完成后,就产生一个类对象,绑定到标识符ClassName上

        Python面向对象基础

类对象及类属性

类对象:类的定义即会生成一个类对象

类的属性:类定义中的变量和方法都是类的属性

类变量:x即为MyClass的变量

foo方法是类的属性,只有实例才能调用

Foo是方法对象method,不再是普通的函数对象function,一般要求至少有一个参数,第一个参数可以是self,self指代当前实例本身

实例化

a = MyClass()

在类对象名称后面加上一个括号,就调用类的实例化方法,完成实例化

实例化创建一个该类的对象(实例)

每次实例化后获得的实例都是不同的实例,即使使用相同的参数实例化,也得到不一样的对象

Python类实例化后,会自动调用__init__方法,该方法将第一个参数必须留给self,其他参数任意

__init__方法

MyClass实际调用的是__init__(self)方法,可不定义,若没有定义会在实例化后隐式调用

__init__()方法不能有返回值,只能是None

作用:对实例进行初始化

            Python面向对象基础

初始化函数可以有多个参数,但第一个位置必须是self

            Python面向对象基础

实例对象instance

类实例化后一定会获得一个对象——实例对象

__init__方法的第一个参数self就是指代某一个实例

类实例化后,得到一个实例化对象,实例化对象会绑定方法

方法的调用者会被作为第一个参数self的实参传入

self.name就是bob对象的name,name保存在bob对象上,而非Person类上,称为实例变量

self

self就是调用者,就是c对应的实例对象

self仅为惯例,可以修改为其他名称,一般不做修改以保证代码的可读性

实例变量和类变量

实例变量是每一个实例自己的变量,是自己独有的;类变量是类的变量,是类的所有实例共享的属性和方法

特殊属性

含义

__name__

对象名

__class__

对象的类型

__dict__

对象的属性的字典

__qualname__

类的限定名

python中每一种对象都拥有不同的属性,函数、类都为对象,类的实例也是对象

        Python面向对象基础

类属性保存在类的__dict__中,实例属性保存在实例的__dict__中,借助__class__找到实例所属的类可以实现从实例访问类的属性

总结

变量是类的,也是这个类所有实例的,其实例都可以访问到;变量是实例的,通过类无法访问到

类变量是属于类的变量,这个类的所有实例可以共享该变量

实例可以动态的为自己增加一个属性,instance.__dict__[变量名]和instance.变量名都可以访问到

实例的同名变量会隐藏这个类变量,即覆盖了该类变量

类变量使用全大写来命名

实例属性的查找顺序

实例通过.来访问属性,会先查找自己的__dict__,若没有则通过属性__class__找到自己的类,再到类的__dict__中查找

实例使用__dict__[变量名]访问变量,则不会查找类中的属性

类的装饰

        Python面向对象基础

装饰的本质就是为;类对象动态的添加一个属性

类方法和静态方法

普通函数

无参函数在定义时没有指定self,不能完成实例对象的绑定,无法使用

类方法

        Python面向对象基础

在类定义中,使用@classmethod装饰器装饰的方法

必须至少一个参数,且第一个参数留给cls,cls指代调用者即类对象自身

cls可为任意其他字符串,不建议修改保证可读性

通过cls可以直接操作类的属性

静态方法

        Python面向对象基础

在类定义中,使用@staticmethod装饰器装饰的方法

调用时不会隐式传入诸如self、cls之类的参数

静态方法,只是表明该方法属于这个名词空间,函数放在一起方便组织和管理

方法的调用

类几乎可以调用内部定义的所有方法,但是调用普通方法时会报错,原因是必须有self参数

实例几乎可以调用所有的方法,普通函数的调用一般不使用,不允许该种定义

总结

类除了普通方法都可以调用,普通方法需要对象的实例作为第一个参数

实例可以调用所有类中定义的方法(包括classmethod、staticmethod),普通方法传入实例自身,静态方法和类方法需要找到实例的类

访问控制

私有(private)属性

使用双下划线开头的属性名

            Python面向对象基础

外部无法访问__age

可使用方法来访问

            Python面向对象基础

私有变量的本质

            Python面向对象基础

类定义的时候,如果使用双下划线开头声明一个实例变量,Python解释器会将其改名,转换为_类名__变量名 的名称

可是使用私有变量特定格式的名称从外部访问私有变量,并修改它

保护变量

在变量名前使用一个下划线

            Python面向对象基础

并未改变名称,和普通属性一样,解释器不做任何特殊处理

只是一种约定,提示开发者不要直接使用该变量

私有方法

和保护变量、私有变量一样使用单下划线、双下划线命名的方法

            Python面向对象基础

本质

单下划线的方法只是开发者的约定,解释器不做任何修改

双下划线的方法是私有方法,解释器会改名,_类名__方法名,,保存在类的__dict__中

属性装饰器

好的设计:将实例的属性保护起来,不让外部直接访问,外部使用getter和setter读取或设置属性

        Python面向对象基础

使用property装饰器时者三个方法同名

property装饰器:后面跟的函数名就是以后的属性名,即是getter,这个必须有,有了它至少是只读属性

setter装饰器:与属性名同名,且接收2个参数,第一个为self,第二个为要赋值的值,有了它,属性可写

deleter装饰器:可以将属性删除,很少用

property必须在前,setter、deleter在后

property通过简单的方式,将对方法的操作变成对属性的访问,并起到一定的隐藏效果

原创文章,作者:ZBD20,如若转载,请注明出处:http://www.178linux.com/97655

(0)
ZBD20ZBD20
上一篇 2018-05-06
下一篇 2018-05-06

相关推荐

  • 文件IO常用操作

    io模块 StringIO BytesIO 类
    pathlib模块 路径操作 3.4版本开始
    os模块 更改权限、显示信息 3.4版本之前路径操作
    shuril 模块(高级文件操作
    csv 文件
    configparser模块 ini文件处理

    2018-05-02
  • Python的内置数据结构

    字符串、列表、元组

    Python笔记 2018-03-31
  • Python 部分知识点总结(三)

    此篇博客只是记录第五周未掌握或不熟悉的知识点,用来加深印象。

    2018-04-08
  • 封装与解构 集合

    封装和解构 封装:将多个值进行分割,结合在一起,本质上返回元组,只是省掉了小括号 ‘==‘意思为内容一致,‘=’意思为内存空间一致 解构:把线性结构的元素解开,并顺序的赋值给其他变量,左边接纳的变量数要和左边解开的元素数量一致 集合不是非线性 解构中使用*变量名接收,但不能单独使用,被*变量名收集后组成一个列表 第一个下划线为9,结果被第二个下划线重新赋值为…

    Python笔记 2018-04-01
  • 杨辉三角专题

    杨辉三角;二项式

    2018-04-09