Python3入门(八)——面向对象OOP
一、概述
老生常谈了,万物皆对象。Python作为一门面向对象的语言,也不例外
直接看一个简单的类定义和实例化类的示例:
class Student:
pass stu = Student()
// pass表示什么也不做
二、类和实例
这在Java等OOP语言中也很常见,这里不再赘述:类是抽象的模板,实例是具体的对象
定义类通过class关键字,后面跟类名,并在类名后通过括号指定从哪个类继承而来。object是所有类的父类:
class Student(object):
pass
实例化则通过类名加括号的形式:
stu = Student()
对于需要绑定的属性,可以通过特殊的__init__方法:(Java中通常叫构造器),类属性则直接在类中定义即可。
其中__init__第一个参数必须是self,用来表示实例本身;后面再在方法内部进行参数绑定:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
相应的实例化的时候也需要进行参数绑定:
stu = Student("张三", 90)
在Python中也可以在类中定义方法类达到封装数据的效果:
这里只需要在类中定义方法时传入self,其他和普通函数一样。外部调用时不用传入self,其他也和普通函数一样
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score def print_score(self):
print("你的成绩是:%s" % self.score) stu = Student("张三", 90)
stu.print_score()
静态方法使用注解即可:
@staticmethod
def m():
print("静态方法")
// 也就是Java中的static了
三、访问控制
前面的代码中__init__方法虽然进行了属性绑定,但就像Java中通过Public定义成员变量一样的,外部是可以为所欲为的直接操作变量的
为了达到Java的private效果,我们通过之前介绍的__双下划线即可实现:
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score def print_score(self):
print("你的成绩是:%s" % self.__score) @staticmethod
def m():
print("静态方法") stu = Student("张三", 90)
stu.print_score()
# 使用__后无法直接访问
# print(stu.name)
这样只能在内部通过__访问,而外部只能通过相关的公开方法操作了,达到了类似Java中的private的效果
对应的get set形式如下:
class Student(object):
def __init__(self, name, gender):
self.name = name
self.__gender = gender
def get_gender(self):
return self.__gender
def set_gender(self, gender):
self.__gender = gender
// 后续补充摸索get set的真正写法和快速生成法
四、继承和多态
1.继承
通过继承,可以得到父类的全部功能。当然,子类也具备继承中常见的覆盖override
class Person(object):
def __init__(self, name, age):
self.__name = name
self.age = age def run(self):
print("奔跑吧!") class Man(Person):
pass man = Man("江北", 18)
man.run()
// 更多继承相关,待补充
2.多态
多态的概念也不再赘述,这里介绍一下Python中判断类型的方法:
>>> isinstance(a, list)
给出一个多态的示例:
class Person(object):
def run(self):
print("奔跑吧!")
class Man(Person):
def run(self):
print("奔跑吧!男生")
class Woman(Person):
def run(self):
print("奔跑吧!女生")
def my_run(p):
p.run()
my_run(Man())
my_run(Woman())
当然,从代码可以看到动态语言并不像静态语言(例如Java)一样有严格的继承体系和严格的多态。
实际上这里的my_run()方法只要接收一个有run()方法的对象即可,它不必非要是Person的子类
五、获取对象信息
1.type()
判断对象类型,使用type()函数
>>> type(123)
<class 'int'>
2.instance()
判断属于某种类型
>>> isinstance(p, Person)
True
3.dir()
获取对象的所有属性和方法
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:
>>> hasattr(obj, 'x') # 有属性'x'吗?
True
Python3入门(八)——面向对象OOP的更多相关文章
- PHP面向对象(OOP)编程入门教程
面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...
- 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...
- Python3中面向对象 OOP
Python3中面向对象 OOP 定义: python中通过关键字 class 实现类的定义: class ClassName(object): pass 获取成员变量:ClassName.变量名 修 ...
- PHP面向对象(OOP)编程入门教程链接
PHP官方学习OOP: http://php.net/manual/zh/oop5.intro.php 从其他博主学习:(以下链接来源: http://blog.snsgou.com/post-41. ...
- Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。
Python3 与 C# 面向对象之-继承与多态 文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...
- python3入门之类
在面向对象的语言中,类是最重要的一环,python自然拥有类这个机制.python的类机制,与C++,java的区别不是很大,类的大多数的重要特性都被沿用了,一样可以多态,抽象,封装: python3 ...
- Python入门篇-面向对象概述
Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- php面向对象(OOP)编程完全教程
摘自:http://www.php-note.com/article/detail/41 面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行P ...
- 拖拽系列二、利用JS面向对象OOP思想实现拖拽封装
接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到 ...
随机推荐
- CSS文字超出指定长度,用省略号
overflow:hidden; text-overflow:ellipsis; white-space:nowrap; display: block;
- vue Element-UI 分页使用(1)
最近在使用Element-UI这套框架配合Vue来写前端页面.在用Element-UI来制作表格的时候,遇到了一些小问题,记录方便学习. 其中两个事件是关于切换当前页和切换显示的列表条数的.另外的属性 ...
- 学习笔记(4)——实验室集群管理结点IP配置
经过验证,集群管理结点mgt的IP配置应为如下所示: [root@mgt zmq]# ifconfig//外部网卡 eth0 Link encap:Ethernet HWaddr 5C:F3:FC:E ...
- Atitit.播放系统规划新版本 and 最近版本回顾 v3 pbf.doc 1 版本11 (ing)41.1 规划h5本地缓存系列 41.2 Android版本app41.3 双类别系统,
Atitit.播放系统规划新版本 and 最近版本回顾 v3 pbf.doc 1 版本11 (ing)4 1.1 规划h5本地缓存系列 4 1.2 Android版本app4 1.3 双类别系统, ...
- SVN CentOS7 下配置svn的安装及基础配置介绍
CentOS7 下配置svn的安装及基础配置介绍 by:授客 QQ:1033553122 目录 一. 二. 三. 四. 五. 六. 七. 一. 实践环境 CentOS 7操作系统(CentO ...
- MVC与单元测试实践之健身网站(一)-项目概述
前不久刚刚通过租房网站的开发学习了MVC,并随后学习了单元测试相关的基础,现在开始健身网站的开发,该项目将结合MVC与单元测试,在开发实践过程中,趁热打铁,巩固并运用之前的内容. 一 健身网站功能描述 ...
- 关于DAL层使用静态方法,并在WEB层直接调用的问题
同样的疑惑,记录一下吧: http://bbs.csdn.net/topics/360204198 DAL静不静态看connection等关键资源是否静态 比如下面的代码,就算静态也没事 public ...
- 【python】python之tuple元组
tuple特性 python的tuple与列表类似,不同之处在于tuple的元素不能修改. tuple使用小括号,列表使用方括号. tuple创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. ...
- 处理 Windows 虚拟机的计划内维护通知
Azure 定期执行更新,以提高虚拟机的主机基础结构的可靠性.性能及安全性. 更新包括如下更改:修补托管环境或升级以及解除硬件授权. 大多数此类更新在执行时不会影响托管的虚拟机. 但是,也会存在更新产 ...
- SELECT查询结果集INSERT到数据表
简介 将查询语句查询的结果集作为数据插入到数据表中. 一.通过INSERT SELECT语句形式向表中添加数据 例如,创建一张新表AddressList来存储班级学生的通讯录信息,然后这些信息恰好存在 ...