一、面向对象概述

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。

而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。

在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

二、面向对象的三大特性

封装、继承、多态

二、面向对象技术简介

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 实例变量:定义在方法中的变量,只作用于当前实例的类。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

三、创建类

使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,如下实例:

class Classname(object):
    '类帮助信息'
    class_suite #类体

class后面紧接着是类名,即Classname,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。

类的帮助信息可以通过ClassName.__doc__查看。

class_suite 由类成员,方法,数据属性组成。

实例1:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
class Employee(object):
    '所有员工的基类'
    empcount = 0
    def __init__(self,name,salary):
        self.name = name
        self.salary = salary
        Employee.empcount += 1
    def displaycount(self):
        print("Total Employee %d"%Employee.empcount)

    def displayemployee(self):
        print("Name :",self.name, "Salary :", self.salary)
  • empCount变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用Employee.empCount访问。
  • 注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:

创建实例对象

要创建一个类的实例,你可以使用类的名称,并通过__init__方法接受参数。

# 创建Employee类的第一个对象
emp1 = Employee("Zara",2000)
# 创建Employee类的第二个对象
emp2 = Employee("Manni",5000)

访问属性

您可以使用点(.)来访问对象的属性。使用如下类的名称访问类变量:

emp1.displayemployee()
emp2.displayemployee()
print("Total Employee %d"%Employee.empcount)

完整实例

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
class Employee(object):
    '所有员工的基类'
    empcount = 0
    def __init__(self,name,salary):
        self.name = name
        self.salary = salary
        Employee.empcount += 1
    def displaycount(self):
        print("Total Employee %d"%Employee.empcount)

    def displayemployee(self):
        print("Name :",self.name, "Salary :", self.salary)

# 创建Employee类的第一个对象
emp1 = Employee("Zara",2000)
# 创建Employee类的第二个对象
emp2 = Employee("Manni",5000)

emp1.displayemployee()
emp2.displayemployee()
print("Total Employee %d"%Employee.empcount)

执行以上代码输出结果如下:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/test.py
Name : Zara Salary : 2000
Name : Manni Salary : 5000
Total Employee 2

你可以添加,删除,修改类的属性,如下所示:

# 添加,删除,修改类属性
emp1.age = 18   #添加一个age属性
emp1.salary = 8888 #修改salary属性
del emp1.age #删除age属性

你也可以使用以下函数的方式来访问属性:

  • getattr(obj, name[, default]) : 访问对象的属性。
  • hasattr(obj,name) : 检查是否存在一个属性。
  • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
  • delattr(obj, name) : 删除属性。
print(getattr(emp1,'salary'))   # 返回salary的属性值
print(hasattr(emp1,'name'))     # 如果存在name属性返回True
setattr(emp1,'age',18)          # 添加一个属性age,值为18
print(getattr(emp1,'age'))
delattr(emp1,'age')             # 删除age属性
print(hasattr(emp1,'age'))

self是个什么鬼?

self是python自动会给传值的参数,哪个对象执行方法,self就是谁

emp1 = Employee("Zara",2000) 此时self = emp1

特殊成员

1、__call__使用对象()的形式运行是输出__call__方法

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
class Foo(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self, *args, **kwargs):
        print("call")

obj1 = Foo("Alex",33)
obj1()  #对象()方式执行

执行以上代码输出结果如下:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/特殊成员.py
call

2、__str__使用print(对象)输出的不在是内存地址而是__str__方法中return的值

#没有使用__str__方法

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
class Foo(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

obj1 = Foo("Alex",33)
print(obj1)

执行以上代码输出结果如下:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/特殊成员.py
<__main__.Foo object at 0x0000000000A3B9E8>

# 使用__str__方法

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
class Foo(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return  "姓名: %s 年龄: %d"%(self.name,self.age)

obj1 = Foo("Alex",33)
print(obj1)

执行以上代码输出结果如下:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/特殊成员.py
姓名: Alex 年龄: 33

3、__dict__ 内置方法获取对象中封装的字段,以字典的形式输出

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
class Foo(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self, *args, **kwargs):
        print("call")

    def __str__(self):
        return  "姓名: %s 年龄: %d"%(self.name,self.age)

obj1 = Foo("Alex",33)
print(obj1.__dict__)  

执行以上代码输出结果如下:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/特殊成员.py
{'name': 'Alex', 'age': 33}

Python基础之面向对象的更多相关文章

  1. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  2. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  3. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  4. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  5. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  6. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  7. Python基础7 面向对象编程进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...

  8. Python之路【第六篇】python基础 之面向对象(一)

    一.三大编程范式 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比 ...

  9. python基础之面向对象高级编程

    面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个"函数"供使用(可以讲多函数中公用的变量封装到对象中) ...

  10. python基础(八)面向对象的基本概念

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对 ...

随机推荐

  1. 汽车之家一道SQL 面试题,大家闲来无事都来敲一敲

    写在前面 上周去汽车之家面试,拿到这个SQL笔试题顿时感觉到有些陌生,因为好长时间不写SQL语句了,当时只写了表设计,示例数据和SQL语句都没写出来. 汽车之家应该用的SQL Server, 编程题一 ...

  2. js图片预加载

    图片预加载有大体有几种方式 1.html标签或css加载图片. 显而易见我们使用img标签或者通过标签的background-image属性都可以实现图片的预加载.但是为了避免初次载入过多图片影响体验 ...

  3. 利用js2image把代码压缩成圣诞树

    马上圣诞节了,作为一名程序猿,如何体现自己独特的过节风格,如何在朋友圈发一张专属自己的祝福照片我觉得很有必要,你们说是不是. 谈到圣诞节,话说程序猿和圣诞之间的关系还有这么一个笑话: Q:程序员为什么 ...

  4. C#开发微信门户及应用(44)--微信H5页面开发的经验总结

    在我们开发微信页面的时候,需要大量用到了各种呈现的效果,一般可以使用Boostrap的效果来设计不同的页面,不过微信团队也提供很多这方面的资源,包括JSSDK的接口,以及Weui的页面样式和相关功能页 ...

  5. httpRuntime与ASP.NET 运行时及IIS处理模型

    配置 ASP.NET HTTP 运行时设置,以确定如何处理对 ASP.NET 应用程序的请求,配置节及其描述如下所示. <httpRuntime executionTimeout="1 ...

  6. WNMP集成环境下配置thinkPHP

    在网上查了许多解决方法,下面是自己测试过能行的方法,只需在nginx.conf文件添加内容就可以了. 打开nginx.conf文件 ## Try the requested URI as files ...

  7. DDD开发框架ABP之本地化资源的数据库存储扩展

    在上一篇<DDD开发框架ABP之本地化/多语言支持>中,我们知道,ABP开发框架中本地化资源存储可以采用XML文件,RESX资源文件,也提供了其他自定义的存储方式的扩展接口.ABP框架默认 ...

  8. 26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 有好一段时间没更新博文了,最近在忙两件事:1.看书,学习中...2.为公司年会节目做准备,由于许久没有练习双截棍了,难免生疏,所以现在临时抱 ...

  9. GJM : C#语言学习笔记

    --------------------------------------C#--------------------------------------if (tom == null) tom = ...

  10. GJM :C#开发 异步处理是目的,多线程是手段

    但是BeginAccept和EndAccept不就是system.net.socket封装好的异步socket吗如果用多线程来实现的话那就不叫异步了吧 1.再次强调,异步是目的,多线程是手段. 所谓异 ...