一、面向对象编程三大特征

Python是面向对象的语言,同样支持面向对象的编程的三大特征:继承,封装,多态。

封装是指隐藏对象的属性和实现细节,只对外提供必要的一些方法,私有属性,私有方法是实现封装地 一些方法。

继承是实现代码重用的方法,可以极大避免代码的重用,同时还可以在继承的基础上进行重构。

多态可以按字面意思理解为“多种状态”,在编程中是指一个方法调用但是由于对象不同而产生的不同结果。

三、继承

语法格式

Class 子类类名(父类)

类体

如果在类定义中没有指定父类,则默认父类是object 类。也就是说,object 是所有类的父

类。

如果定义子类时,有多个父类,也叫多继承。

class Student:

    # 定义基本属性

    n = 'Bob'

    a = 0

    # 定义私有属性,私有属性在类外部无法直接进行访问

    __w = 0

    # 定义构造方法

    def __init__(self, n, a, w):

        self.n = n

        self.a = a

        self.__w = w

    def know(self):

        #类内部可以直接调用

        print('my weight is: ',Student.__w )

        print("%s say: I’m  %d years old。" % (self.n, self.a))

#继承于父类Student, People也叫做子类

class People(Student):

    t = ''

    def __init__(self, n, a, w, t):

        self.t = t

        #定义父类的构造函数

        Student.__init__(self, n, a, w)

    def know(self):

        print("%s say: I’m  %d years old and %d cm。" % (self.n, self.a, self.t))

my = People('王二', 18 , 55,175)

my.know()  #调用定义方法

运行结果:

王二 say: I’m  18 years old and 175 cm。

上面的例子中包含了成员继承和方法重写,成员继承是指子类继承了父类除构造方法之外的所有成员。方法重写是指子类重新定义父类中的方法,这样就会覆盖父类的方法。

多重继承

python 支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,python从左至右搜索。

class Aa:

    def ab(self):

        print(1234567)

class Bb:

    def ab(self):

        print(7654321)

class Cc(Bb, Aa):

    def cc(self):

        print('嗯哼')

class Dd(Aa, Bb):

    def dd(self):

        print('嗯哼')

c = Cc()

c.ab()

d = Dd()

d.ab()

输出结果:

7654321

1234567

从结果我们可以知道执行了Bb类中的方法,因为父类中方法相同且没有指定父类,从左到右,会先去执行最左面类中的方法。

三、多态

1. 多态是方法的多态,属性没有多态。

2. 多态的存在有2 个必要条件:继承、方法重写。

class Name:

    def say(self):

        print(" I will introduce myself")

class Mary(Name):

    def say(self):

        print("I'm Mary")

class Bob(Name):

    def say(self):

        print("My name is Bob")

def say_name(a):

    if isinstance(a,Name):

        a.say()              #传入的对象不同,shout方法对应的实际行为也不同。

say_name(Mary())

say_name(Bob())

输出结果:

I'm Mary

My name is Bob

这里用到了isinstance函数,简单介绍一下。Isinstance属于python的内置函数,它是用来判断一个对象是否是一个已知的类型。

isinstance(object, classinfo)

object -- 实例对象。

classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。

在isinstance(a,Name)中,a代表实例对象。Name表示类名。

四、运算符重载

让自定义的类生成的对象(实例)能够使用运算符进行操作

格式:

def __xx__(self,other):

语句块

class V:

    def __init__(self, a, b):

        self.a = a

        self.b = b

    def __str__(self):

        return 'V(%d, %d)' % (self.a, self.b)

    def __add__(self, other):

        return V(self.a + other.a, self.b + other.b)

a1 = V(1, 3)

a2 = V(1, -4)

print(a1 + a2)

结果:

V(2, -1)

08-Python面对对象进阶的更多相关文章

  1. Python - 面对对象(进阶)

    目录 Python - 面对对象(进阶) 类的成员 一. 字段 二. 方法 三. 属性 类的修饰符 类的特殊成员 Python - 面对对象(进阶) 类的成员 一. 字段 字段包括:普通字段和静态字段 ...

  2. Python - 面对对象(基础)

    目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...

  3. Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

    目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...

  4. 小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系)

    小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系 1. 依赖关系. 最轻的一种关系 在方法中引入另一个类的对象 class Elephant: def __init__(sel ...

  5. 小学生绞尽脑汁也学不会的python(面对对象-----成员)

    小学生绞尽脑汁也学不会的python(面对对象-----成员) 成员 class Person: def __init__(self, name, num, gender, birthday): # ...

  6. 16、python面对对象之类和继承

    前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名 ...

  7. 15、python面对对象之类和对象

    前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念.类的定义.类属性.实例属性及实例方法等. 一.类和对象的概念 问题:什么是类?什么是实例对象? 类:是一类事物的抽象概念,不是真 ...

  8. python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法

    一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...

  9. python面对对象编程----2:__init__

    面对对象编程估计我们最早接触到的就是__init__了,也就是实例的初始化处理过程: 1:来看看最基础的__init__ class Card(object): #抽象类Card,并不用于实例化 de ...

  10. python面对对象

    面对过程VS面对对象 面向过程的程序设计的核心是过程,过程就是解决问题的步骤,面向过程的设计就是考虑周全什么时候处理什么东西 优点:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. ...

随机推荐

  1. WEditor(元素定位工具)安装和定位界面元素

     1. 安装adb(安装方法——百度网盘(无邪)) 2. 安装python-uiautomator2 pip install --pre -U uiautomator2 3. 手机设备安装atx-ag ...

  2. rust 生命周期2

    之前定义的结构体,都是不含引用的. 如果想定义含引用的结构体,请定义生命周期注解 #[warn(unused_variables)] struct ImportantExcerpt<'a> ...

  3. Vmware的各版本KEY

    算是之前收集到的备份一下在这里吧,顺便方便别人(ô‿ô) 应该是比较全的 VMware Workstation4.xx for WindowsZHDH1-UR90N-W844G-4PTN6G1NP0- ...

  4. 虚拟机 VMware 设置VMWARE通过桥接方式使用主机无线网卡上网

    环境:WIN7旗舰版,台式机,U盘无线上网卡. 虚拟软件:VMware9.0,虚拟系统:CentOS6.4 需要实现虚拟机以独立机形式工作和上网. 先介绍一下VMware网络设置的三种方式 1 Hos ...

  5. android java层通过jni加载使用第三方的so库

    1.例如我们自己编译一个so库,我们的其他模块要加载如何操作了 首先在c盘新建立一个文件夹sb,在sb下面新建立一个文件夹jni,如果你要使用ndk编译so库,必须需要有jni目录 2.在jni目录下 ...

  6. Flink1.10全文跟读翻译

    前言 突然的一个想法,我想把flink官网英语版全部看一遍翻译出来,并且带上自己的理解.自己不是什么大神,只是想这样做一遍,有人说不是有中文版,因为我自己想练习一下英语和对flink的理解吧!工作是一 ...

  7. 九、深度优先 && 广度优先

    原文地址 一.什么是"搜索"算法? 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于"图"这种数据结构的. 因为图这种数据结构的表达能 ...

  8. 基于AOP和ThreadLocal实现日志记录

    基于AOP和ThreadLocal实现的一个日志记录的例子 主要功能实现 : 在API每次被请求时,可以在整个方法调用链路中记录一条唯一的API请求日志,可以记录请求中绝大部分关键内容.并且可以自定义 ...

  9. Java中时间加减的比较

    public class TestDate{ public static void main(String[] args){try{ Date date=new Date(); DateFormat  ...

  10. Nuxt+Express后端api接口配置与实现方式

    Nuxt.js 是一个基于 Vue.js 的轻量级应用框架,可用来创建服务端渲染 (SSR) 应用.本文带你了解在 Nuxt.js 中使用 Express 如何编写实现后端的 api 接口. 创建接口 ...