Python笔记-面向对象编程
1、类和实例
面向-对象的三大特点:数据封装、继承和多态
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
假设我们要处理学生的成绩表,为了表示一个学生的成绩,面向过程的程序可以用一个dict表示:
std1 = { 'name': 'Michael', 'score': 98 }
std2 = { 'name': 'Bob', 'score': 81 }
而处理学生成绩可以通过函数实现,比如打印学生的成绩:
def print_score(std):
print('%s: %s' % (std['name'], std['score']))
如果采用面向对象的程序设计思想,我们首选思考的不是程序的执行流程,而是Student
这种数据类型应该被视为一个对象,这个对象拥有name
和score
这两个属性(Property)。如果要打印一个学生的成绩,首先必须创建出这个学生对应的对象,然后,给对象发一个print_score
消息,让对象自己把自己的数据打印出来。
class Student(object):
def __init__(self,name,score):
self.name=name
self.score=score
def print_info(self):
print('the {0} of score is {1}'.format(self.name,self.score))
def get_grade(self):
if self.score>=90:
return 'A'
elif self.score>=60:
return 'B'
else :
return 'C'
stu1=Student('Andre',90)
stu2=Student('Natasha',75)
stu3=Student('秋儿',59)
stu1.print_info()
stu2.print_info()
stu3.print_info()
print(stu1.name,stu1.get_grade())
print(stu2.name,stu2.get_grade())
结果:
the Andre of score is 90
the Natasha of score is 75
the 秋儿 of score is 59
Andre A
Natasha B
秋儿 C
小结:
要定义一个方法,除了第一个参数是self
外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self
不用传递,其他参数正常传入
name,score,方法这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。
2、访问限制
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
,在Python中,实例的变量名如果以__
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
class Student(object):
def __init__(self,name,score):
self.__name=name
self.__score=score def set_gender(self,gender):
if gender=='male' or gender=='female':
self.__gender=gender
else:
raise ValueError('incorrect value') def get_score(self):
return self.__score
def get_name(self):
return self.__name
def get_gender():
return self.__gender def print_info(self):
print('the {0} of score is {1}'.format(self.__name,self.__score)) def get_grade(self):
if self.__score>=90:
return 'A'
elif self.__score>=60:
return 'B'
else :
return 'C' #对象实例化
stu1=Student('Andre',90)
stu2=Student('Natasha',75)
stu3=Student('秋儿',59) #打印姓名,成绩信息
stu1.print_info()
stu2.print_info()
stu3.print_info() #set实例性别
stu4=Student('龙儿',66)
stu4.set_gender('male')
#print(stu4.get_gender()) #获取实例的姓名以及分数等级
print(stu1.get_name(),stu1.get_grade())
print(stu2.get_name(),stu2.get_grade())
print(stu3.get_name(),stu3.get_grade())
3、继承和多态
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
class Animal(object):
def run(self):
print('Animal is running......') class Dog(Animal):
def run(self):
print('Dog is running......') class Cat(Animal):
def run(self):
print('Cat is running...') def run_twice(animal):
animal.run() a = Animal()
d = Dog()
c = Cat() print('a is Animal?', isinstance(a, Animal))
print('a is Dog?', isinstance(a, Dog))
print('a is Cat?', isinstance(a, Cat)) print('d is Animal?', isinstance(d, Animal))
print('d is Dog?', isinstance(d, Dog))
print('d is Cat?', isinstance(d, Cat)) run_twice(c)
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
4、获取对象信息
使用type()函数可以判断对象的类型
>>> type(123)
对于class的继承关系来说,使用
<class 'int'>type()
就很不方便。我们要判断class的类型,可以使用isinstance()
函数。
>>> isinstance(h, Animal)
True
5、实例属性和类属性
我们定义一个类属性,这个属性虽然归类所有,但类的所有实例都可以访问到
class Student(object):
name = 'Student'
联系
为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加:
class Student(object):
count=0
def __init__(self,name):
self.name=name
Student.count+=1
def get_gender(self,gender):
if gender=='male' or gender=='female':
self.__gender=gender
else:
raise ValueError('Values Error!') student1=Student('Natasha')
student1.get_gender('male')
student2=Student('Andrei') print(Student.count)
Python笔记-面向对象编程的更多相关文章
- python笔记 面向对象编程从入门到高级
目录: 一.概念 二.方法 2.1组合 2.2继承 2.3多态 2.4封装 2.5归一化设计 三.面向对象高级 3.1 反射(自省) 3.2 内置方法__getatter__, __ ...
- Python:面向对象编程3 定制类(有更新)
Python:面向对象编程3 定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- python笔记之编程风格大比拼
python笔记之编程风格大比拼 虽然我的python age并不高,但我仍然愿意将我遇到的或者我写的有趣的python程序和大家一块分享,下面是我找到的一篇关于各类python程序员的编程风格的比较 ...
- Python之面向对象编程学习
不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...
- PyTorch框架+Python 3面向对象编程学习笔记
一.CNN情感分类中的面向对象部分 sparse.py super(Embedding, self).__init__() 表示需要父类初始化,即要运行父类的_init_(),如果没有这个,则要自定义 ...
- python基础-面向对象编程
一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...
- python之面向对象编程
1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...
随机推荐
- 《HelloGitHub》第 33 期
公告 欢迎 点击分享 自荐或发现的开源项目,也可安装 分享插件 更便捷地推荐有趣的开源项目. 小伙伴们,新的一年就要来了,今年的 Bug 改完了吗?先看看<HelloGitHub>最新一期 ...
- SuperMap iObject入门开发系列之六管线区域查询
本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 管线区域查询功能针对单一管线图层进行区域多边形框选查询,然后将查询结果输出为列表,并添加定位和闪烁功能,效果如下图所示 ...
- psql 关于主键自增的问题
在psql中往往我们需要设置一个自增的主键id字段,psql中不像SQL Server那样点选 打钩傻瓜式就能设置好的,是需要创建序列的:CREATE SEQUENCE,关键字SEQUENCE. 我们 ...
- Prometheus安装和配置node_exporter监控主机
Node_exporter是可以在* Nix和Linux系统上运行的计算机度量标准的导出器. Node_exporter 主要用于暴露 metrics 给 Prometheus,其中 metrics ...
- .NET Core微服务之基于App.Metrics+InfluxDB+Grafana实现统一性能监控
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.关于App.Metrics+InfluxDB+Grafana 1.1 App.Metrics App.Metrics是一款开源的支持. ...
- 【工利其器】必会工具之(一)Source Insight篇
前言 “Source Insight(以下简称SI)是世界上最好的编辑器”,说这句话不知道会不会出门被打呢?-_- 中国古话说得好,“文无第一,武无第二”,所以不敢说SI是最好的,但是 ...
- springboot~注册bean的方法
spring在启动时会自己把bean(java组件)注册到ioc容器里,实现控制反转,在开发人员使用spring开发应用程序时,你是看不到new关键字的,所有对象都应该从容器里获得,它们的生命周期在放 ...
- Redis~Linux环境下的部署
回到目录 Redis的生产环境建议部署到linux上,而在开发时可以连接windows版本,下面介绍如何在linux上部署redis. $ wget http://download.redis.io/ ...
- tcc-transaction 分析
tcc-transaction是TCC型事务java实现,具体项目地址 点我.本文通过tcc-transaction和Springcloud,分析下tcc-transaction的原理. 要了解一个 ...
- centos7 安装 smplayer
How to setup multimedia on CentOS 7 You will need to also install the EPEL repository as nux-dextop ...