08-Python面对对象进阶
一、面向对象编程三大特征
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面对对象进阶的更多相关文章
- Python - 面对对象(进阶)
目录 Python - 面对对象(进阶) 类的成员 一. 字段 二. 方法 三. 属性 类的修饰符 类的特殊成员 Python - 面对对象(进阶) 类的成员 一. 字段 字段包括:普通字段和静态字段 ...
- Python - 面对对象(基础)
目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...
- Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)
目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...
- 小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系)
小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系 1. 依赖关系. 最轻的一种关系 在方法中引入另一个类的对象 class Elephant: def __init__(sel ...
- 小学生绞尽脑汁也学不会的python(面对对象-----成员)
小学生绞尽脑汁也学不会的python(面对对象-----成员) 成员 class Person: def __init__(self, name, num, gender, birthday): # ...
- 16、python面对对象之类和继承
前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名 ...
- 15、python面对对象之类和对象
前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念.类的定义.类属性.实例属性及实例方法等. 一.类和对象的概念 问题:什么是类?什么是实例对象? 类:是一类事物的抽象概念,不是真 ...
- python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法
一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...
- python面对对象编程----2:__init__
面对对象编程估计我们最早接触到的就是__init__了,也就是实例的初始化处理过程: 1:来看看最基础的__init__ class Card(object): #抽象类Card,并不用于实例化 de ...
- python面对对象
面对过程VS面对对象 面向过程的程序设计的核心是过程,过程就是解决问题的步骤,面向过程的设计就是考虑周全什么时候处理什么东西 优点:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. ...
随机推荐
- centos 8分区方案
https://www.cnblogs.com/yogurtwu/p/10717001.html https://zhuanlan.zhihu.com/p/126308255 常见目录解释 Linux ...
- Jmeter服务器监控技术
meter-plugins.org推出了全新的Plugins Manager,对于其提供的插件进行了集中的管理, 将 ServerAgent-xxx.jar上传被测服务器解压 进入目录 ServerA ...
- 在ASP.NET 中有哪些数据验证控件(请解释ASP.NET中以什么方式进行数据验证)?
(1)RequiredFieldValidator:检查用户是否输入: (2)CompareValidator:检查两个表单输入项的输入信息是否存在某种指定关系,比如大.等于等: (3)RangeVa ...
- junit配合catubuter统计单元测试的代码覆盖率
1.视频参考孔浩老师ant视频笔记 对应的build-junit.xml脚步如下所示: <?xml version="1.0" encoding="UTF-8&qu ...
- TestNG离线安装步骤
1.下载testNG 离线安装包[eclipse-testng离线包],并解压.资源可以在下载:http://download.csdn.net/detail/u012100968/9623613: ...
- java 中的自动装箱和拆箱操作
在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成一个 ...
- 使用反应式关系数据库连接规范R2DBC操作MySQL数据库
1. 简介 三月份已经介绍过R2DBC,它是一种异步的.非阻塞的关系式数据库连接规范.尽管一些NoSQL数据库供应商为其数据库提供了反应式数据库客户端,但对于大多数项目而言,迁移到NoSQL并不是一个 ...
- msf stagers开发不完全指北(二)
采用 Golang 开发stagers 上一篇文章 msf stagers开发不完全指北(一)中我们谈到如何采用 c 进行 msf 的 stagers 开发,这篇文章我们探讨一下如何使用 Golang ...
- SerializableClob转String
ORACLE数据库读取CLOB字段,JAVA中获取到类型为SerializableClob,如何转换成String类型那? 以下是代码示例: SerializableClob sc = ...
- Docker环境下Java应用的最大内存和堆内存的设置
Docker环境下Java应用的最大内存和堆内存的设置 1. 设置应用允许使用的最大内存 通过docker run(创建一个新的容器并运行)命令中设置-m来进行设置.案例如下所示. docker r ...