谈面向对象的编程(Python)
(注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正。)
今天中秋节,也没什么特别的,寻常日子依旧。
谈谈面向对象吧,什么叫面向对象?
那么问题来了,你有对象吗? 嗯,,,那我可以做你的经纪人吗?
言归正传
对于我来说,从接触到使用python其实有较长一段时间了。要说Python最核心的东西,我想了想,那应该当属面向对象的编程了吧。下面写一点我的理解:
一、面向对象与面向过程的区别
通俗的讲,面向过程是编年史(按照历史年份写下来的的);
面向对象是纪传史(比如说项羽本纪,讲的就是项羽的故事。项羽就是---对象)。
换一种方式讲:
面向过程可以理解为我不停的写函数完成我要的功能。注重函数实现。
面向对象则是我在写这个功能的时候考虑把这个功能分类封装起来。以后我就可以直接拿来用了。注重封装好后调用,不用管
函数怎么实现,只要结果。
举例:
面向过程:
def 吃饭():
def 睡觉():
def 打豆豆(): 吃饭() #比如要吃饭
面向对象:
class 屌丝的一天:
def 吃饭():
def 睡觉():
def 打豆豆():
#引入了类的概念 diaosi = 屌丝的一天()
diaosi.吃饭()
二、类的概念(class)
类其实是一种数据结构,我们可以用它来定义对象,一个类会包含属性和行为特性.类是现实世界抽象的实体以编程形式出现。类是一个模板,模板中包装了多个“函数”供使用。(Python中一切皆是对象,类也是对象。)
1. 类的成员:字段、方法和属性
i字段
字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同。普通字段属于对象,静态
字段属于类。
class person:
height = '' #静态字段
def __init__(self,weight):
self.weight = weight #普通字段 #访问静态字段
print(person.height) #输出173
#访问普通字段
weng = person('')
print(weng.weight) #输出60
由上述代码可以看出普通字段需要通过对象来访问;静态字段通过类访问。
静态字段在内存中只保存一份;普通字段在每个对象中都要保存一份
在上面的类person里面,height是全局变量(在这个类的函数中都生效),而self.weight是局部变量。
ii 方法
方法包括:普通方法、静态方法和类方法。
普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
静态方法:由类调用;无默认参数;
class person:
#定义普通方法
def hello(self):
print('普通方法') #定义类方法
@classmethod
def haha(cls):
print('类方法') #定义静态方法
@staticmethod
def hehe():
print('静态方法') weng = person()
weng.hello() #调用普通方法
person.haha() #调用类方法
person.hehe() #调用静态方法
III 属性
由属性的定义和调用要注意一下几点:
定义时,在普通方法的基础上添加 @property 装饰器;
定义时,属性仅有一个self参数
调用时,无需括号
方法:foo_obj.func()
属性:foo_obj.prop
属性的定义有两种方式:
装饰器 即:在方法上应用装饰器
静态字段 即:在类中定义值为property对象的静态字段(即property装饰器)
(注:关于装饰器的内容,等我升值加薪再写吧
)
三、 构造函数 __init__()
用于初始化类的内容部状态,Python提供的构造函数式 __init__();也就是当该类被实例化的时候就会执行该函数(通过类创造对象时,
自动触发执行)。
class person:
def __init__(self,name,age):
self.name = name
self.age = age
weng = person('weng','')
四、 析构函数 __del__() (用来释放内存的)
当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释
器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
class person:
def __init__(self,name,age):
self.name = name
self.age = age
def __del__(self):
pass
weng = person('weng','')
接下来是面向对象的三个主要特性:封装、继承、多态
一、封装
就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
class person:
def __init__(self,name,age):
self.name = name
self.age = age weng = person('weng','') #将内容封装给weng
print(weng.age) #调用封装的某处内容
和平时常用的方法十分相似。
二、继承
面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。
class dad:
def height(self,height):
print (height)
def weight(self,weight):
self.weight = weight
class son(dad):
#继承了身高、体重,没继承兴趣
def interests(self):
print('打游戏') weng = son()
weng.height('')
weng.interests()
多继承:
· 是否可以继承多个类
· 如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?
1、Python的类可以继承多个类
2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先

· 当类是经典类时,多继承情况下,会按照深度优先方式查找
· 当类是新式类时,多继承情况下,会按照广度优先方式查找
经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当
前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。
class dad: #经典类
pass
class son(dad): #经典类
pass class dad1(object): #新式类
pass
class son1(dad1): #新式类
pass
下面给出网上的两个例子,供参考:
class D:
def bar(self):
print('D.bar')
class C(D):
def bar(self):
print('C.bar')
class B(D):
def bar(self):
print('B.bar')
class A(B, C):
def bar(self):
print('A.bar')
a = A()
a.bar()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
class D(object):
def bar(self):
print('D.bar')
class C(D):
def bar(self):
print('C.bar')
class B(D):
def bar(self):
print('B.bar')
class A(B, C):
def bar(self):
print('A.bar')
a = A()
a.bar()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
三、多态
多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特
性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的
目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使
用“家谱”中任一类的实例的某一属性时的正确调用。
class Animal(object):
def __init__(self, name):
self.name = name
def talk(self):
raise NotImplementedError("Subclass must implement abstract method")
class Cat(Animal):
def talk(self):
print('%s: 喵喵喵!' %self.name)
class Dog(Animal):
def talk(self):
print('%s: 汪!汪!汪!' %self.name)
def func(obj): #一个接口,多种形态
obj.talk()
c1 = Cat('小苏')
d1 = Dog('小江')
func(c1)
func(d1)
输出结果:

经过此番折腾,我把我面向对象的理解分享完了。而我的对象,她在哪里?哎呀,老铁,扎心了。
谈面向对象的编程(Python)的更多相关文章
- Python 2.7 学习笔记 面向对象的编程
python是一种面向对象的语言.本文介绍如何用python进行面向对象的编程. 首先我们说下对象和类,类是一种类型的定义,对象是类的实例. 一.内置对象类型(内置类) 其实我们前面已经大量用到了对象 ...
- python粗谈面向对象(一)
1.面向过程编程vs函数式编程 面向过程编程 以计算对象的元素个数为例. str_1 = 'abcdefg' count = 0 for i in str_1: # 统计字符串元素个数 count + ...
- 简明python教程 --C++程序员的视角(五):面向对象的编程
面向对象的编程 在大多数时候你可以使用过程性编程,但是有些时候当你想要编写大型程序或是寻求一个更加合适的解决方案的时候,你就得使用面向对象的编程技术. 对象可以使用普通的属于对象的变量存储数据.属于一 ...
- 简明python教程七----面向对象的编程
根据操作数据的函数或语句块来设计程序的,被称为面向过程的编程. 把数据和功能结合起来,用称为对象的东西包裹起来的组织程序的方法,称为面向对象的编程理念. 类和对象是面向对象编程的两个主要方面.类创建一 ...
- python学习笔记--面向对象的编程和类
一.面向对象的编程 面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想.二.面向对象的特性类:class类,对比现实世界来说就是一个种类,一个模 ...
- Python之面向对象函数式编程
Python之面向对象函数式编程 函数式编程的根本就是用 def 去模拟数学式的编程逻辑. 类似与 y = 2*x + 1 ,当x = 3 时,函数的结果y就得7. def test(x): retu ...
- python进阶_浅谈面向对象进阶
python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class F ...
- python03 面向对象的编程01
话不多说,直接进入正文: 编程思想: 我个人所了解的有2种,还有个函数式编程的概念模模糊糊(大概是把常用的代码封装成一个函数,重复调用即可,先认为就是这样吧) 1 面向对象:面向对象是把所有的事务物当 ...
- C语言面向对象风格编程
前言 本文略谈C面向对象风格编程,如何使用过程式语言去模拟面向对象的特性?C面向对象的方式和形式很多,不一而足,本文的代码形式是模拟部分C++面向对象关键词并赋予其特性,这种方式对于初级程序员比较好理 ...
随机推荐
- django admin后台css样式丢失
尼玛 坑爹啊 怎么光秃秃的,跟人家的不一样啊 打开firebug 发现报错,找不到css 通过google找到原因,是因为admin所需的js ,css等静态文件虽然都在django的安装目录内,但是 ...
- C# 笔记 Func<TResult> 委托、Action<T> 委托
https://blog.csdn.net/wanglui1990/article/details/79303894 Func<ΤResult> 委托:代理(delegate)一个返回类型 ...
- TreeSet排序,存储自己定义对象,自己定义比較器演示样例
Set:无序.不能够反复元素. |--HashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:推断元素的hashCode值是否同样. 假设同样,还会继续推断元素的equals方法.是 ...
- 第十三篇:K-Means 聚类算法原理分析与代码实现
前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...
- 从远程(包括ftp,http等协议)地址获取文件流信息
URL url = new URL("ftp://172.18.251.155:8010/recordsImg/2019-01-28/000008_1548649813267.jpg&quo ...
- python的其他安全隐患
零.绪论 python这里以python2.7为研究对象,对应的我们会简要说明一下python3,其他指与反序列化无关的安全隐患问题. 一.标准输入输出: 1.首先,我们来看下标准输入输出 impor ...
- pdb文件及引发的思考
最初只想知道线上iis里需要不需要pdb文件,了解部分之后对于.net底层产生了浓厚的兴趣,看了一点点资料 资料来源: https://www.cnblogs.com/itech/archive/20 ...
- CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器
CSS样式表和JS脚本加载顺序 Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变 JS脚本尽可能放在<body> ...
- java发展历程、常用dos命令与jDK工具使用
Java菜鸟学习之旅 1.勤敲代码 2.必须将课堂上讲的内容学到位 2.1 学到会用 2.2 在学会之前不要自作主张 2.3 当天课程当天完成 3.能说会道 3.1 善于表达 3.2 学会的都能讲 4 ...
- Hibernate的多对多映射关系
example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate ...