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

相关推荐

  • Python内置数据结构——列表

    知识框架图 学习笔记 数据结构分类 数值 int、float、complex、bool都是class int:长整型,没有上限,取决于内存区域大小 float:支持十进制和科学计数法,仅支持双精度 complex:复数,有实数和虚数部分 bool:int的子类,True、False对应1、0,可以和整数直接运算 序列对象 字符串str 列表list 元组tu…

    2018-03-26
  • Python内置数据结构——字符串

    知识结构图 学习笔记 字符串 字符组成的有序序列,字符的集合 使用单引号、双引号、三引号引起来的字符序列 不可变对象 Unicode类型 定义 单引号、双引号、三引号 r、R:引号内的字符原样输出 元素访问 索引访问 可迭代 join连接 “string“.join(iteratable) 使用string作为分隔符将可迭代对象连接起…

    2018-03-31
  • Python 部分知识点总结(十)

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

    Python笔记 2018-05-28
  • 解析式

    列表解析式和字典解析式 datetime模块 对日期,时间,时间戳的处理 datetime类 today()返回本地时区当前的datetime对象 now(tz=None)返回当前时间的datetime对象,时间到微秒,如果tz为None,返回和today()一样 utcnow()没有时区的当前时间 fromtimestamp(timestamp,tz=Zo…

    2018-04-09
  • Python高阶函数及装饰器

    First Class Object 函数在Python中是一等公民 函数也是对象,可调用的对象 函数可作为普通变量、参数、返回值等 高阶函数 数学定义:y=g(f(x)) 高阶函数需满足的条件,至少其一 接受一个或多个函数作为参数 输出一个函数 内建函数的高阶函数 排序:sorted(iterable[,key][,reverse]) 返回一个新列表,对一…

    2018-04-22