类提供了一种 组合数据和功能 的方法。创建一个新类意味着:创建一个新 类型  的对象,从而允许创建一个该类型的新 实例。

每个类的实例可以拥有: 保存自己状态的属性。

一个类的实例也可以有改变自己状态的方法(定义在类中的)。

一、名称和对象

  对象具有个性,多个名称(在多个作用域内)可以绑定到同一个对象,这在其他语言中成为别名。

  在处理不可变的基本类型(数字、字符串、元祖)时,可以安全的忽略它。

  但是,对可变对象如(列表、字典、集合等),python代码的语义会产生惊人的影像。

二、作用域和命名空间

  在介绍类之前,我首先要告诉你一些Python的作用域规则。类定义对命名空间有一些巧妙的技巧,你需要知道作用域和命名空间如何工作才能完全理解正在发生的事情。顺便说一下,关于这个主题的知识对任何高级Python程序员都很有用。

  让我们从一些定义开始:

  1. 命名空间(namespace)

    • 一个从名字到对象的映射
    •  当前,大部分命名空间都由python字典实现,一般情况下不会去关注它们(除了要面对性能问题时),而且也有可能在将来更改;
    • 几个命名空间的例子:
      • 存放内置函数的集合(包含abs()这样的函数,和内建的异常等)
      • 模块中的全局名称
      • 函数调用中的局部名称
      • 从某种意义讲,对象的属性集合也是一种命名空间的形式
    • 注意:不同命名空间中的名称之间绝对没有关系。例如:两个不同模块都可以定义一个my_max()函数,而不会产生混淆(模块的用户必须在其前面加上模块名称)。
  2. 属性
    •  任何跟在 “点” 之后的名称都称为:属性;
  3. 生存期
    •  不同时刻创建的命名空间拥有不同的生存期;
    • 内置名称的命名空间是在python解释器启动时创建的,永远不会删除;
    • 模块的全局命名空间,在模块定义被读入时创建,通常模块的命名空间会持续到解释器退出;
    • 被解释器的顶层调用执行的语句,被认为是__main__模块调用的一部分(从一个脚本文件读取或交互式地读取),因此它们拥有自己的全局命名空间;
    • 内置名称实际也存在于一个模块中,称作:builtins。
  4. 函数的本地命名空间
    •  一个函数的本地命名空间,在这个函数被调用时创建,并在函数返回或抛出一个不在函数内部处理的错误时被删除
    • 每次,递归调用都会有它自己的本地命名空间
  5. 作用域
    •  指命名空间可直接访问的python程序的文本区域,这里的 ‘可直接访问’ 意味着:对名称的引用(非限定),会尝试在命名空间中查找名称;
      1. L:local,局部作用域,即函数中定义的变量;
      2. E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
      3. G:globa,全局变量,就是模块级别定义的变量;
      4. B:built-in,内建作用域,系统固定模块里面的变量,比如:int,bytearray等
      • 搜索变量的优先级顺序LEGB,即:局部作用域 > 外层嵌套作用域 > 当前模块的全局作用域 > python内置作用域

三、类定义

  最简单的类定义看起来像这样:

 class ClassName:
<statement-1>
.
.
.
<statement-N>

  类定义与函数定义 (def 语句) 一样必须被执行才会起作用。 (你可以尝试将类定义放在 if 语句的一个分支或是函数的内部。)

  在实践中,类定义内的语句通常都是函数定义,但也允许有其他语句,有时还很有用 ;

  当进入类定义时,将创建一个新的命名空间,并将其用作局部作用域 --- 因此,所有对局部变量的赋值都是在这个新命名空间之内。 特别的,函数定义会绑定到这里的新函数名称

  当(从结尾处)正常离开类定义时,将创建一个 类对象。 这基本上是一个包围在类定义所创建命名空间内容周围的包装器。 原始的(在进入类定义之前起作用的)局部作用域将重新生效,类对象将在这里被绑定到类定义头所给出的类名称 (在这个示例中为 ClassName)。

四、类对象

  类对象支持两种操作:属性引用实例化

  1、属性引用 :

  使用 Python 中所有属性引用所使用的标准语法: obj.name。 有效的属性名称是类对象被创建时存在于类命名空间中的所有名称。 因此,如果类定义是这样的:

 class MyClass:
"""A simple example class"""
i = 12345 def f(self):
return 'hello world'

  那么 MyClass.i 和 MyClass.f 就是有效的属性引用,将分别返回一个整数和一个函数对象。 类属性也可以被赋值,因此可以通过赋值来更改 MyClass.i 的值。 __doc__ 也是一个有效的属性,将返回所属类的文档字符串: "Asimple example class"

  2、实例化

  类的 实例化 使用函数表示法。 可以把类对象视为是返回该类的一个新实例的不带参数的函数。 举例来说(假设使用上述的类):  

 x = MyClass()  #创建类的新 实例 并将此对象分配给局部变量 x

  3、__init__()初始化

  实例化操作(“调用”类对象)会创建一个空对象。 许多类喜欢创建带有特定初始状态的自定义实例。 为此类定义可能包含一个名为 __init__() 的特殊方法,就像这样:

 def __init__(self):
self.data = []

  当一个类定义了 __init__() 方法时,类的实例化操作会自动为新创建的类实例发起调用 __init__()。 因此在这个示例中,可以通过以下语句获得一个经初始化的新实例:

 x = MyClass()

  当然,__init__() 方法还可以有额外参数以实现更高灵活性。 在这种情况下,提供给类实例化运算符的参数将被传递给 __init__()。 例如,:

 >>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

五、类的继承与派生

python3 之 面向对象(类)、继承、派生和多态的更多相关文章

  1. Lua程序设计(四)面向对象类继承

    1.类继承 ①代码 Sharp = { _val = } --① 父类 function Sharp:new() local new_sharp = { } self.__index = self - ...

  2. Python3 面向对象-类的继承与派生

    1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类可称为基类或超类,新建的类称为派生类和或子类. 子类会遗传父类的属性,从而解决代码重用问题. ...

  3. Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)

    上节课复习:1.编程思想    面向过程        核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么        基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...

  4. Day 23 类的继承,派生,组合,菱形继承,多态与多态性

    类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...

  5. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  6. 面向对象:继承(经典类&新式类继承原理、属性查找)、派生

    继承: 继承是指类与类之间的关系,是一种“什么”是“什么”的关系. 继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基 ...

  7. java面向对象类的继承~ 匿名类 ;多态特性;强制类型转换

    类的继承 创建子类语法:     修饰符 class 子类名 extends 父类名{        } 匿名子类语法: 直接实例化,过程中通过匿名类 继承父类,在实例化过程中将子类匿名 <父类 ...

  8. C++ Pirmer : 第十五章 : 面向对象程序设计之基类和派生的定义、类型转换与继承与虚函数

    基类和派生类的定义以及虚函数 基类Quote的定义: classs Quote { public: Quote() = default; Quote(cosnt std::string& bo ...

  9. Python 基础之面向对象类的继承与多态

    一.继承 定义:一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法继承: 1.单继承 2.多继承子类: 一个类继承了另外一个类,那么这个类是子类(衍生类)父类:一个类继承了另外一个类,被继 ...

  10. Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态

    一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

随机推荐

  1. SQL common keywords examples and tricks

    Case Sensitive Check 1. Return names contain upper case Select id, name from A where name<>low ...

  2. 深入全面探究有未经处理的异常: 0xC00000FD: Stack overflow(栈溢出)问题!

    这两天一直遇到标题上的问题,我相信很多朋友在执行代码的时候都会遇到这样的问题,我在网上也找了很多的资料解决这个问题,虽然有些方法能解决,但是总觉得总结的不是很全面,这里我自己在相对全面的总结一下,如果 ...

  3. deepin15.7挂载/home到单独的分区:

    1.首先打开Gpart分区编辑器,找一个空闲的分区,调整好分区大小,格式化成ext4格式. 具体步骤为首先unmount所用到的盘,然后右击该盘选择'format to ext4',最后点击apply ...

  4. 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!

    目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...

  5. pymysql 防止sql注入案例

    from pymysql import connect def main(): """sql演示""" # 1.输入一个语句,根据id展示相 ...

  6. SpringBoot整合Redis在可视化工具乱码问题,以及常用的api

     pom依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...

  7. Linux tar命令解压时提示时间戳异常的处理办法

    在Linux服务器上的文件会有3个时间戳信息 访问时间(Access).修改时间(Modify).改变时间(Change),都是存放在该文件的Inode里面 问题描述: 公司网站是前后端分离的,所有的 ...

  8. PHP输出A到Z及相关

    先看以下一段PHP的代码,想下输出结果是什么. <?php for($i='A'; $i<='Z'; $i++) { echo $i . '<br>'; } ?> 输出的 ...

  9. IndentationError: unindent does not match any outer indentation level笔记

    执行一个Python脚本的时候,报"IndentationError: unindent does not match any outer indentation level" 错 ...

  10. mysql 5.6.44 zip 安装教程(基于windows )

    首先我们从官网下载最新版本的mysql 5.6.44版本,网页地址: ,我的电脑是64位的版本,所以我选择的是64位版本,如果是32位,根据实际情况下载所需要的安装包.