一、概述

  老生常谈了,万物皆对象。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的更多相关文章

  1. PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...

  2. 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?

    面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...

  3. Python3中面向对象 OOP

    Python3中面向对象 OOP 定义: python中通过关键字 class 实现类的定义: class ClassName(object): pass 获取成员变量:ClassName.变量名 修 ...

  4. PHP面向对象(OOP)编程入门教程链接

    PHP官方学习OOP: http://php.net/manual/zh/oop5.intro.php 从其他博主学习:(以下链接来源: http://blog.snsgou.com/post-41. ...

  5. 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.单继 ...

  6. python3入门之类

    在面向对象的语言中,类是最重要的一环,python自然拥有类这个机制.python的类机制,与C++,java的区别不是很大,类的大多数的重要特性都被沿用了,一样可以多态,抽象,封装: python3 ...

  7. Python入门篇-面向对象概述

    Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...

  8. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  9. php面向对象(OOP)编程完全教程

    摘自:http://www.php-note.com/article/detail/41 面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行P ...

  10. 拖拽系列二、利用JS面向对象OOP思想实现拖拽封装

    接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到 ...

随机推荐

  1. Android解析WindowManager(一)WindowManager体系

    前言 WindowManagerService(WMS)和AMS一样,都是Android开发需要掌握的知识点,同样的,WMS也很复杂,需要多篇文章来进行讲解,为何更好的理解WMS,首先要了解Windo ...

  2. FAST特征点检测算法

    一 原始方法 简介 在局部特征点检测快速发展的时候,人们对于特征的认识也越来越深入,近几年来许多学者提出了许许多多的特征检测算法及其改进算法,在众多的特征提取算法中,不乏涌现出佼佼者. 从最早期的Mo ...

  3. SQL Server如何附加只有mdf的数据库文件

    有时候SQL Server意外断电会导致SQL Server的ldf日志文件丢失或者损坏,这个时候你如果直接附加mdf文件到SQL Server会失败,这里提供一个方法可以还原只有mdf的数据库文件, ...

  4. EJB Remote/Local 绑定和JNDI Lookup

    从同事那里学到一种方便的注解SessionBean的方式.代码我放到github去了 https://github.com/EdisonXu/Test/commit/703d49123dca9e666 ...

  5. .Net WebRequest异步请求与WebClient异步请求

    很多情况下一般会使用同步方式发出请求,直到响应后再做后续的逻辑处理等,但有时候后续的逻辑处理不依赖于请求的结果或者是可以挂起等到响应后再处理,又或者是为了解决UI“假死”的现象,这时可以使用异步请求 ...

  6. windows使用

    将桌面.我的文档.收藏夹等转移到其他盘 方法很多,介绍如下: 一.新装的系统,桌面.我的文档.收藏夹等都是默认在C盘的,并且这些数据都是用户经常用到的一些数据.为了避免以后系统崩溃所带来的危险,最好的 ...

  7. Visual Studio 2012自动添加注释(如版权信息等)

    转自:http://blog.163.com/guohuan88328@126/blog/static/69430778201381553150156/ 如何使用Visual Studio 2012给 ...

  8. chmod chown llinux文件及目录的权限介绍

    linux 文件或目录的读.写.执行权限说明: chmod :设置文件或目录权限. u:所有者 g:所在组 o:其他组 a:所有人(u.g.o的总和) chmod  -R  文件1/文件2…..    ...

  9. Shell学习---Shell脚本的静态检查工具shellcheck

    Shell脚本的静态检查工具shellcheck ubuntu下 apt install shellcheck ,即可安装shellcheck.写完shell脚本,记得用它检查一下,能给你点建议的.要 ...

  10. MySQL基础之 日期时间函数

    基础日期函数和时间函数 1.CURDATE()函数:返回当前只带有年月日格式的日期 2.CURTIME()函数:返回当前只带有时分秒格式的时间 3.NOW()函数:返回当前日期和时间 4.UNIX_T ...