Python之路【第九篇】:Python面向对象
阅读目录
一、三大编程范式
编程范式即编程的方法论,标识一种编程风格:
大家学习了基本的python语法后,大家可以写python代码了,然后每个人写代码的风格不同,这些不同的风格就代表了不同的流派;
如果把python的基本语法比作武术的基本功,那么不同的编程风格就好比不同的武林门派。
虽然大家风格不同,但是都可以完成你的编程需求,python是一门面向对象编程语言,但是目前为止,你从未接触面向对象编程,然而你已经可以解决很多问题了,在python中并没有人强制你使用哪一种固定的风格。
三大编程范式:
1、面向过程编程:
2、函数式编程:
3、面向对象编程:
二、编程进化论
1、编程最开始就是无组织无结构,从简单控制流中按步写指令
2、从上述的指令中提取重复的代码块或逻辑,组织到一起(比如说,你定义一个函数),便实现了代码重用,且代码由无结构走向结构化,创建程序的过程变得更具逻辑性
3、我们定义函数都是独立于函数外定义变量,然后作为参数传递给函数,这意味着:数据与动作是分离的
4、如果我们把数据和动作内嵌到一个结构(函数或类)里面,那么我们就有了一个‘对象系统’(对象就是数据与函数整合到一起的产物)。
#狗的特征
dog1={
'name':'朱锐',
'gender':'公',
'type':'藏獒'
} dog2={
'name':'simon',
'gender':'母',
'type':'吉娃娃'
} person1={
'name':'william',
'gender':'母',
'type':'人'
} def dog(name,gender,type):
# 狗的动作
def jiao(dog):
print('一条狗[%s], 汪汪汪' %dog['name'])
def chi_shi(dog):
print('一条狗[%s] 正在拉屎' %dog['type'])
def init(name,gender,type):
dog1 = {
'name':name,
'gender':gender,
'type':type,
'jiao':jiao,
'chi_shi':chi_shi,
}
return dog1
return init(name,gender,type) d1=dog('simon','母','吉娃娃')
d2=dog('william','母','藏獒')
print(d1)
print(d2)
d1['jiao'](d1)
d2['chi_shi'](d2)
输出结果:
C:\Python35\python3.exe G:/python_s3/chapter24-面向对象/面向对象.py
{'jiao': <function dog.<locals>.jiao at 0x0000000000B3E0D0>, 'gender': '母', 'chi_shi': <function dog.<locals>.chi_shi at 0x0000000000B3E1E0>, 'type': '吉娃娃', 'name': 'simon'}
{'jiao': <function dog.<locals>.jiao at 0x0000000000B3E2F0>, 'gender': '母', 'chi_shi': <function dog.<locals>.chi_shi at 0x0000000000B3E378>, 'type': '藏獒', 'name': 'william'}
一条狗[simon], 汪汪汪
一条狗[藏獒] 正在拉屎
类:把一类事物的相同的特征和动作整合到一起就是类,类是一个抽象的概念; 对象:就是基于类而创建的一个具体的事物 (具体存在的),也是特征和动作整合到一起;
三、面向对象设计与面向对象编程
3.1 面向对象设计(Object oriented design):将一类具体事物的数据和动作整合到一起,即面向对象设计
面向对象设计(OOD)不会特别要求面向对象编程语言。事实上,OOD可以由纯结构化语言来实现(比如C)。但如果想要构造具备对象性质和特点的数据类型,就需要在程序上做更多的努力。
我们现在想用程序表述一台提款机,可以用面向过程,和面向对象两种方式设计。
3.2 面向对象编程(Object-oriented programming):用定义类+实例/对象的方式去实现面向对象的设计
#用面向对象编程独有的语法class去实现面向对象设计
class Dog:
def __init__(self,name,gender,type):
self.name=name
self.gender=gender
self.type=type def bark(self):
print('一条名字为[%s]的[%s],狂吠不止' %(self.name,self.type)) def yao_ren(self):
print('[%s]正在咬人' %(self.name)) def chi_shi(self):
print('[%s]正在吃屎' %(self.type)) dog1=Dog('alex','female','京巴')
print(dog1.__dict__)
# dog2=Dog('wupeiqi','female','腊肠')
# dog3=Dog('yuanhao','female','藏獒')
#
# dog1.bark()
# dog2.yao_ren()
# dog3.chi_shi()
四、小结
一门面向对象的语言不一定会强制你写OO方面的程序。例如C++可以被认为"更好"的“C”;而JAVA,则是万物皆类,此外还规定,一个源文件对应一个类定义。
然而,在python中,类和OOP都不是日常编程所必需的。尽管它从一开始设计就是面向对象的,并且结构上支持OOP,但Python没有限定或要求你在你的应用中写OO的代码
用面向对象语言写程序,和一个程序的设计是面向对象的,两者是八竿子打不着的两码事。
纯C写的Linux Kernel事实上比C++/java 之类语言搞出来的大多数项目更加面向对象-----只是绝大部分人都自以为自己到处瞎写的class的苗条代码才是面向对象的正统、而死脑筋linus搞得泛文件抽象不过是过程是思维搞出来的老古董。
五、类和对象
1、什么叫类:类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来生产真实的物体(实例)。
2、什么叫对象:睁开眼,你看到的一切的事物都是一个个的对象,你可以把对象理解为一个具体的事物(事物即数据和动作的结合体)
(例如:铅笔是对象,人是对象,房子是对象,狗是对象)
3、类与对象的关系:对象都是由类产生的,上帝造人,上帝首先有一个造人的模板,这个模板即人的类,然后上帝根据类的定义来生产一个个的人。
4、什么叫实例化:由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫做一个实例(实例=对象)
5.1 类相关知识
5.1.1 初识类
在python中声明函数与声明类相似
声明函数:
1 def functionName(args):
2 '函数文档字符串'
3 函数体
声明类:
'''
class 类名:
'类的文档字符串'
类体
''' #我们创建一个类
class Data:
pass
#用类Data实例化出一个对象d1
d1=Data()
5.1.2 属性
类是用来描述一类事物,类的对象指的是这一类事物中的一个个体
是事物就要有属性,属性分为:
1、数据属性:就是变量
2、函数属性:就是函数,在面向对象里通常称为方法
注意:类和对象均用点来访问自己的属性
5.1.3 类的属性
理论:数据属性即变量,类的定义与函数又极其类似,其实可以用函数的作用域来理解类的属性调用
查看类的属性:
我们定义的类的属性到此存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.__dict__:查出的是一个字典,key为属性名,value为属性值
'''
1、数据属性
2、函数属性
'''
class Chinese: ##类名首字母大写
'这是一个中国人的类'
dang='民政党'
def sui_di_tu_tan():
print('朝着墙上就是一口痰')
def cha_dui(self):
print('插到了前面') print(Chinese.dang)
Chinese.sui_di_tu_tan()
Chinese.cha_dui('zhurui') # print(dir(Chinese))
# print(Chinese.__dict__) ##查看类的属性字典
print(Chinese.__dict__['dang'])
Chinese.__dict__['sui_di_tu_tan']()
Chinese.__dict__['cha_dui'](1)
5.2 对象相关知识
对象是由类实例化而来,类实例化的结果称为一个实例或者称作一个对象
5.2.4 查看实例属性
同样是dir和内置__dict__两种方式
5.2.5 特殊实例属性
__class__
__dict__
'''
1.数据属性
2.函数属性
'''
class Chinese:
'这是一个中国人的类' dang='民政党' # def __init__(name,age,gender):
# dic={
# 'name':name,
# 'age':age,
# 'gender':gender
# }
# return dic
def __init__(self,name,age,gender):
# print('我是初始化函数,我开始运行了')
self.mingzi=name #p1.mingzi=name
self.nianji=age #p1.nianji=age
self.xingbie=gender
# print('我结束啦') def sui_di_tu_tan(self):
print('%s 朝着墙上就是一口痰' %self.mingzi)
def cha_dui(self):
print(self)
print('%s 插到了前面' %self.mingzi) def eat_food(self,food):
print('%s 正在吃%s' %(self.mingzi,food)) p1=Chinese('元昊',18,'female') #--->__init__(self,name,age,gender)
p1.sui_di_tu_tan()
p1.eat_food('屎') p2=Chinese('武sir',10000,'姑娘')
p2.eat_food('韭菜馅饼')
print(dir(p2))
#
# # p1=Chinese.__init__(p1,name,age,gender)
#
# print(p1.__dict__)
# # print(p1.__dict__['xingbie'])
# print(p1.mingzi)
# # print(p1.mingzi111111111111111)
#
# print(p1.dang)
#
#
# print(Chinese.__dict__)
# Chinese.sui_di_tu_tan()
# Chinese.cha_dui(p1)
#
# # p1.sui_di_tu_tan()
#
# print('[------------------->')
# p1.cha_dui()
警告:类和对象虽然调用__dict__返回的是一个字典结构,但是千万不要直接修改该字典,会导致你的opp不稳定
5.3 类属性与对象(实例)属性
类属性(增删改查):
#类的属性
'''class ChinesePeople:
country='China'
def __init__(self,name):
self.name=name def play_ball(self,ball):
print('%s 正在打 %s' %(self.name)) def say_word(self,word):
print('%s 说 %s' %(self.name,word)) #查看类属性
print(ChinesePeople.country) #修改类属性
ChinesePeople.country='CHINA'
print(ChinesePeople.country)
#删除类属性
del ChinesePeople.country
#增加类属性
ChinesePeople.country='China'
ChinesePeople.location='Asia'
print(ChinesePeople.__dict__)
#类的数据属性增删改查与函数属性是一样的
ChinesePeople.say_word=say_word
print(ChinesePeople.__dict__)
''' class Chinese:
country='China'
def __init__(self,name):
self.name=name def play_ball(self,ball):
print('%s 正在打 %s' %(self.name))
#查看
print(Chinese.country) #修改
Chinese.country='Japan'
print(Chinese.country) p1=Chinese('simon')
print(p1.__dict__)
print(p1.country) #增加
Chinese.dang='民政党' # print(Chinese.dang)
# print(p1.dang) #删除
del Chinese.dang
del Chinese.country print(Chinese.__dict__)
# print(Chinese.country) def eat_food(self,food):
print('%s 正在吃%s' %(self.name,food)) Chinese.eat=eat_food print(Chinese.__dict__)
p1.eat('饭') def test(self):
print('test') Chinese.play_ball=test
p1.play_ball()# Chinese.play_ball(p1)
实例属性(增删改查):
class Chinese:
country='China'
def __init__(self,name):
self.name=name def play_ball(self,ball):
print('%s 正在打 %s' %(self.name,ball))
p1=Chinese('simon')
print(p1.__dict__) #查看
# print(p1.name)
# print(p1.play_ball) #增加
p1.age=18
print(p1.__dict__)
print(p1.age) #不要修改底层的属性字典
# p1.__dict__['sex']='male'
# print(p1.__dict__)
# print(p1.sex) #修改
p1.age=19
print(p1.__dict__)
print(p1.age) #删除
del p1.age
print(p1.__dict__)
Python之路【第九篇】:Python面向对象的更多相关文章
- Python之路(第九篇)Python文件操作
一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r",encoding = “utf ...
- python之路第一篇
一.python环境的搭建 1.window下环境的搭建 (1).在 https://www.python.org/downloads/ 下载自己系统所需要的python版本 (2).安装python ...
- python之路第二篇(基础篇)
入门知识: 一.关于作用域: 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. if 10 == 10: name = 'allen' print name 以下结论对吗? ...
- python之路入门篇
一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名字,来 ...
- 【python之路1】python安装与环境变量配置
直接搜索 Python,进入官网,找到下载,根据个人电脑操作系统下载相应的软件.小编的是windows os .下载python-2.7.9.msi 安装包 双击安装程序,进入安装步骤.在安装过程中 ...
- Python之路【第九篇】:面向对象进阶
阅读目录 一. isinstance(obj,cls)和issubclass(sub,super)二. 反射三. __setattr__,__delattr__,__getattr__四. 二次加工标 ...
- 【Python之路】第九篇--Python基础之线程、进程和协程
进程与线程之间的关系 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除.线程可与属于同一进程的其它线程共享进程所拥有的全 ...
- Python全栈开发记录_第九篇(面向对象(类)的学习)
有点时间没更新博客了,今天就开始学习类了,今天主要是面向对象(类),我们知道面向对象的三大特性,那就是封装,继承和多态.内容参考该博客https://www.cnblogs.com/wupeiqi/p ...
- python学习【第九篇】python面向对象编程
一.面向对象了解 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. Pyth ...
- Python【第七篇】面向对象进阶
大纲 一.面向对象高级语法 1.静态方法.类方法.属性方法 2.类的特殊成员方法 3.反射 二.异常处理 三.网络编程之socket基础 一.面向对象高级语法 1.静态方法:名义上归类管理,实际上静态 ...
随机推荐
- VUE 基础配置
原文:https://www.cnblogs.com/LearningOnline/p/9368838.html 1.安装Node.js等软件 报错: 解决: 原文:https://pdf-lib.o ...
- Linux 系统管理——进程和计划任务管理
一. 程序和进程关系 1.程序 保存硬盘.光盘等介质中的可执行代码和数据 静态保存的代码 2.进程 在CPU及内存运行的程序代码 动态执行的代码 父.子进程:每一个进程可以创建一个或多个进程 二.静 ...
- Python中近期Pandas使用总结
近期做了很多关于数据处理的问题,发现灵活运用pandas包对于数据分析来说可以轻松好多 导包 import numpy as npimport pandas as pdfrom pandas impo ...
- js之select三级联动
效果图如下: 代码逻辑梳理:层层递进,比如选择了课程后,将对应的课程id保存,然后点击选择章时自动触发对应的时间,根据这个课程ID获取其下面的章信息.其它的如节等,同理. 代码说明:如下代码不规范,可 ...
- 一口气讲完 LSA — PlSA —LDA在自然语言处理中的使用
自然语言处理之LSA LSA(Latent Semantic Analysis), 潜在语义分析.试图利用文档中隐藏的潜在的概念来进行文档分析与检索,能够达到比直接的关键词匹配获得更好的效果. LSA ...
- 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'TableName'中的标识列指定显式值
当某表的一个列为自动增长列,是无法直接通过insert语句向给字段写入指定值,解决方法: SET IDENTITY_INSERT TABLE_NAME ON; INSERT INTO TABLE_NA ...
- UE运行sas配置-WIN10
1.在UE中配置SAS运行的工具: UE--高级---用户工具--工具配置 在命令行输入"D:\soft\SASHome\SASFoundation\9.4\sas.exe" -c ...
- RSA前台加密后台解密的应用
写在前面 项目安全测试需要将登录功能修改, AES加密不符合要求, 现改为RSA非对称加密.(将登录密码加密后传给后台, 后台解密后再进行一系列的校验) .期间遇到了前台js加密但是后台解密失败的问题 ...
- zp本地包
https://pan.baidu.com/s/13670pdPNvG_o1coYFnovXA 密码: 3pk3
- Java13新特性 -- switch表达式
引入了yield语句,用于返回值: 和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块. @Test public void testSwitch ...