Python面向对象编程(一)
1.什么是面向对象
面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的。应用在编程中,是一种开发程序的方法,它将对象作为程序的基本单元。
2.面向对象与面向过程的区别
我们之前已经介绍过面向过程了http://www.cnblogs.com/zhang-can/p/7050182.html,面向过程的核心在‘过程’二字,过程就是解决问题的步骤,面向过程的方法设计程序就像是在设计一条流水线,是一种机械式的思维方式
优点:复杂的问题简单化,流程化
缺点:扩展性差
主要应用场景有:Linux内核,git,以及http服务
面向对象的程序设计,核心是对象,对象就是特征(变量)与技能(函数)的结合体。
优点:解决了程序扩展性差的问题
缺点:可控性差,无法预测最终结果
主要应用场景是需求经常变化的软件,即与用户交互比较频繁的软件
需要注意的是:面向对象的程序设计并不能解决全部问题,只是用来解决扩展性。当然,现在的的互联网软件,扩展性是最重要的
3.对象与类的概念
在python中,一切皆对象,一个对象应该具有自己的属性,也就是特征,还有有自己的功能,即方法
在Python中,特征用变量表示,功能用函数表示,所以对象就是变量与函数的结合体
而从各种各样的对象中抽取出来具有相同特征和相同功能组成的,就是类,所以说类是一系列对象共同特征与功能的结合体
下面让我们来定义一个类,方法与定义一个函数有些类似:
#定义一个中国人的类
class Chinese:
#共同的特征
country='China' #共同的技能
def talk(self):
print('is talking Chinese')
def eat(self):
print('is eating Chinese food')
这样我们就定义好了一个类,注意:1.定义类用class关键字
2.类名一般首字母大写,且冒号前面不需要括号(非必须,有括号也不报错,一般需要继承object类来保证是新式类),区别于函数定义
3.与函数不同,类在定义阶段就会执行类里面的代码
4.类有两种属性,共同的特征叫数据属性,共同的功能叫函数属性
怎样由这个类产生一个对象呢?实例化:
#实例化的方式产生一个对象
p1=Chinese()
p2=Chinese()
我们可以得出结论了,不管现实世界中怎么样,但是在程序中,确实是先有类,才有的对象
我们已经通过实例化的方式得到两个对象了,但是有一个问题,得到的两个对象,特征和功能都是一样的,这根万物皆对象的理念完全不符啊,应该是每个对象都是不同的,这样的世界才有意思啊
事实上,我们在定义类的时候,忘记了定义 __init__() 这个函数,正确的定义方法应该是这样的:
#定义一个中国人的类
class Chinese:
#共同的特征
country='China' #初始化
def __init__(self,name,age):
self.name=name #每个对象都有自己的名字
self.age=age #每个对象都有自己的年龄
#共同的技能
def talk(self):
print('is talking Chinese')
def eat(self):
print('is eating Chinese food') #实例化的方式产生一个对象
p1=Chinese('zhang',18)
类名加括号就是实例化,实例化就会自动触发__init__ 函数运行,可以用它来为每个对象定制自己的特征
我们在定义__init__函数的时候,括号里有三个参数,但是我们实例化调用的时候却只传了两个值,为什么不报错呢?这是因为self的作用就是:实例化的时候,自动将对象本身传给__init__函数的第一个参数,当然self只是个名字了。
注意:这种自动传值的机制只是在实例化的时候才会体现,类除了实例化还有一种作用就是属性引用,方法是类名.属性
#引用类的数据属性
print(Chinese.country) #China #引用类的函数属性
# Chinese.talk()#TypeError: talk() missing 1 required positional argument: 'self'
print(Chinese.talk) #<function Chinese.talk at 0x000001BC5F13D1E0>
Chinese.talk('self') #is talking Chinese #增加属性
Chinese.color='yellow'
#删除属性
del Chinese.color
从上面报错的代码可以看出,属性引用的时候,没有自动传值这回事,如果是类调用类里面的方法,需要手动把类当作参数传给它
Chinese.talk(Chinese)
我们学过名称空间的概念,定义一个变量,或者定义一个函数都会在内存中开辟一块内存空间,类里面也有定义变量(数据属性),定义函数(函数属性),他们也有名称空间,可以通过.__dict__的方法查看
p1=Chinese('zhang',18)
print(Chinese.__dict__)
#{'__module__': '__main__', 'country': 'China', '__init__': <function Chinese.__
# init__ at 0x000002187F35D158>, 'talk': <function Chinese.talk at 0x000002187F35D1E0>,
# 'eat': <function Chinese.eat at 0x000002187F35D268>, '__
# dict__': <attribute '__dict__' of 'Chinese' objects>,
# '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None}
print(p1.__dict__)
#{'name': 'zhang', 'age': 18}
通过上面代码显示的结果我们知道了,打印实例化后的对象的名称空间,只显示自己特有的属性,如果想要找到和其他对象共有的属性,就要去类的名称空间里面去找
还有一个问题,对象的名称空间中没有函数属性,当然也是去类里面找,但是不同对象指定的函数,是一个函数吗
p1=Chinese('zhang',18)
p2=Chinese('li',19)
print(Chinese.talk)#<function Chinese.talk at 0x000001B8A5B7D1E0>
print(p1.talk) #<bound method Chinese.talk of <__main__.Chinese object at 0x000001B8A5B7BD68>>
print(p2.talk) #<bound method Chinese.talk of <__main__.Chinese object at 0x000001B8A5B7BDA0>>
可以看到,并不是,他们的内存地址都不一样。而且注意bound method,是绑定方法
对象本身只有数据属性,但是Python的class机制将类的函数也绑定到对象上,称为对象的方法,或者叫绑定方法。绑定方法唯一绑定一个对象,同一个类的方法绑定到不同的对象上,属于不同的方法。我们可以验证一下:
当用到这个函数时:类调用的是函数属性,既然是函数,就是函数名加括号,有参数传参数
而对象用到这个函数时,对象没有函数属性,他是绑定方法,绑定方法怎么用呢,也是直接加括号,但不同的是,绑定方法会默认把对象自己作为第一个参数
class Chinese:
country='China'
def __init__(self,name,age):
self.name=name
self.age=age
def talk(self):
print('%s is talking Chinese'%self.name)
def eat(self):
print('is eating Chinese food') p1=Chinese('zhang',18)
p2=Chinese('li',19)
Chinese.talk(p1) #zhang is talking Chinese
p1.talk() #zhang is talking Chinese
只要是绑定方法,就会自动传值!其实我们以前就接触过这个,在python3中,类型就是类。数据类型如list,tuple,set,dict这些,实际上也都是类,我们以前用的方法如l1.append(3),还可以这样写:l1.append(l1,3)
未完待续。。。
Python面向对象编程(一)的更多相关文章
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
随机推荐
- iOS CAEmitterLayer 实现粒子发射动画效果
iOS CAEmitterLayer 实现粒子发射动画效果 效果图 代码已上传 GitHub:https://github.com/Silence-GitHub/CoreAnimationDemo 动 ...
- 影响国内WinCE7发展的最大障碍是没有D版下载
WinCE红火的时代已经过去,做嵌入式系统时考虑WinCE的越来越少,网络上相关文章也是越来越少. 但真正用过WinCE的应该有体会,它集成了文件系统,tcp/ip,GUI系统,usb驱动,就这些,你 ...
- MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?
本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的 ...
- Java基础——继承
学习Java继承之前,我们想回忆一下Java面向对象需要特别注意的几个关键点. 面向对象是将复杂的事情简单化了,它通过封装的方式使得代码的重用性更高和安全性更强.平时我们要学会用面向对象的方式去思考, ...
- 实现容器的底层技术 - 每天5分钟玩转 Docker 容器技术(30)
为了更好地理解容器的特性,本节我们将讨论容器的底层实现技术.cgroup 和 namespace 是最重要的两种技术.cgroup 实现资源限额, namespace 实现资源隔离. cgroup c ...
- oracle 10G 没有 PIVOT 函数怎么办,自己写一个不久有了
众所周知,静态SQL的输出结构必须也是静态的.对于经典的行转列问题,如果行数不定导致输出的列数不定,标准的答案就是使用动态SQL, 到11G里面则有XML结果的PIVOT. 但是 oracle 10G ...
- 9天C#转Java学习过程,自己记录一下
其实没有完整的9天,就是连续每天花点时间,过程so frustrated,踩坑无数...下面是学习过程的记录 第1天 开始正式学习JavaEE,已完成: 1. Tomcat安装: 2. Tomcat配 ...
- Linux系统vi模式下显示行号
在命令模式下输入:set nu或者:set number都可以为vi设置行号,如果要取消的话,则输入:set nonu行号的设置是vi的环境设置,不会影响文本的内容.
- input 等替换元素的baseline问题
行内标签和设置为block:inline;形式的标签与input并排放置时,为何会错位?例如下面的. 因为在同一行中,所有行内元素默认 baseline 对齐.但是,input(还有textarea. ...
- 探索Windows命令行系列(6):活用批处理解决实际问题
1.批量修改文件名 2.批量重启服务 3.全盘搜索指定文件 3.1.全盘搜索名称为 mm.jpg 的文件,获取其全路径 3.2.查找系统中所有名称以 .docx 结尾的文件 4.调用可执行程序 4.1 ...