Python -面向对象(一 基本概念)
一 Python简单介绍
Python是一个可移植的面向对象的脚本语言。
Python尽管是一个脚本语言,但也是一个全然面向对象的语言。由于它设计之初把易用性做为很重要的一个考量标准,所以用起来很简洁,优美(语法很灵活),所以使用Python能够高速地编写出可执行代码。
与C/C++相比,Python程序的执行速度比較慢,一门语言既然能够生存下来。就有它自己的原因,Python语言也一样。当今的计算机处理速度已经很快,对某些任务来说,执行速度并非首要考虑的因素。比方说为了实现数据库訪问的自己主动化,须要做一个数据库訪问的代码生成器,这是一个常见的任务,当中涉及编程的很多方面,包含字符串处理、数据库訪问,可能还包含一个GUI系统。
这个任务显然不太适合用C或者C++来编写。由于使用C/C++来开发尽管能够节省那么一点执行时间,但却浪费了大量的开发时间。所以,语言没有好不好之分,仅仅有适合不适合之分。
C++是静态强类型语言,而Python是动态强类型语言。因为是动态语言,所以变量的类型不是用keyword显式指定,而是在执行时依据赋给它的值动态推断出来的。
1. Python是面向对象的。它支持继承以及多重继承、多态、操作符重载等面向对象的概念。
2. Python是可移植的。使用Python语言编写的程序通常无需改动就能够执行在多个平台上,这点与Java类似。
可是Python也提供一些Plantform dependent的模块,使用这些模块的时候必须小心,由于他们是不可移植的。
3. Python是解释性语言。准确地说,Python先把源程序编译成中间代码(类似于java和c#)。然后解释运行。
但要注意的是。编译过程对程序猿来说是透明的(这又不同于java和c#)。
4.Python是一门动态语言。它支持元数据编程;支持执行时编译、执行等现代语言的高级特征。这些都非常难甚至无法在C/C++中实现。Python甚至同意你在执行的时候添加一个对象的成员!
5. 一切都是对象!
Python中对象的概念比其它语言丰富得多,比方类是一个对象,因此你能够在执行的时候使用它,而不像C++一样,类是编译时的对象。
正由于这样的原因,使得Python是高度动态的。
6. 自己主动内存管理。像java一样。你无需管理你的代码所使用的内存。在C和C++的程序中,那是一场恶梦。
7. 其它:Python能够使用c/c++的编写的组件,也能够把python代码嵌入到c/c++代码中运行。
classNum = 0
def __init__(self):
self.num = 1
ZZClass.classNum += 1
print ("ZZClass _init__ called.")
def __del__(self):
ZZClass.classNum -= 1;
print ("ZZClass __del__ called.")
def Hello(self):
print("hello world!")
self.PrintClassNum(10) #普通函数中能够调用静态函数
def setNum(self,num):
self.num = num
def getNum(self):
return self.num
@staticmethod
def PrintClassNum(num=100):
print (ZZClass.classNum) #在静态方法中仅仅能通过类名訪问类变量
#print classNum #在静态方法中不能直接訪问类变量
#print self.num #在静态方法中不能訪问实例变量
print num
@classmethod
def ClassMethod(cls):
#print cls.num #在类方法中不能直接訪问实例变量
print "class method."
print cls.classNum #在类方法中能够直接訪问类变量
myObj = ZZClass()
myObj.Hello()
ZZClass.PrintClassNum(10) #能够通过类名来訪问静态方法
myObj02 = ZZClass()
myObj02.PrintClassNum() #能够通过对象实例来訪问静态方法
print myObj.classNum #能够通过对象实例来訪问类变量
print ZZClass.classNum #能够通过类名来訪问静态变量
myObj.setNum(10)
myObj02.setNum(20)
print myObj.getNum()
print myObj02.getNum()
myObj02 = 0
print ZZClass.PrintClassNum()
print ZZClass.ClassMethod() #通过类调用类方法
print myObj.ClassMethod() #通过实例调用类方法
ZZClass _init__ called.
指针是隐藏的,由编译器来处理。
但这一改动方式将对该类变量实例化。其结果是该实例将得到一个单独的该变量拷贝。此后此对象不再与类共享该名称的变量。
(这一点Python有点复杂),看以下的样例:
class classA:
classVar = ''
def __init__(self):
pass
def set_var1(self,x):
classA.classVar= x
def set_var2(self,y):
self.var2 = y
return self.var2
oa = classA()
ob = classA()
print oa.classVar #class variable.
print ob.classVar #class variable.
oa.classVar = "changed."
print oa.classVar #changed.
print ob.classVar #class variable.
oa.set_var1("class variable01")
print oa.classVar #changed.
print ob.classVar #class variable01
ob.set_var1("class variable02")
print oa.classVar #changed.
print ob.classVar #class variable02
ob.set_var2("inst variable")
print ob.var2
#print oa.var2 #error! because var2 is a instance variable
假设通过实例对象去引用。会产生一个同名的实例属性。这样的方式改动的是实例属性。不会影响到类属性,而且之后假设通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。
类方法能够通过自己的參数cls訪问类成员,而静态方法则不行,能够通过类名间接訪问。staticmethod无需參数,classmethod须要类变量作为參数传递(不是类的实例)。类函数另一个用途就是能够对类属性进行改动。
class Test:
count = 0
def __init__(self,c):
self.count = c
self.__name="zhangzhe" #私有变量
self.__class__.count = self.__class__.count +1
def __get_name(self): #私有方法
return self.__name
def get_counte(self):
return self.count
print a.count #3
#print a.name #AttributeError:Test
instance has no attribute 'name'
print Test.count #1
print a.get_counte() #3
print a.__dict__ #{'count': 3, '_Test__name': 'zhangzhe'}
print a._Test__name #zhangzhe
print Test.__dict__
<function __get_name at 0x101e92500>, '__doc__': None, '__init__':
<function __init__ at 0x101e92488>, 'get_counte': <function get_counte at 0x101e92578>}
b = Test(-1)
print b.count #1
print Test.count #2
这里定义的__name是私有属性,__get_name()是私有方法,直接訪问的话,会提示找不到相关的属性或者方法。能够通过使用 a._Test__name和a._Test__get_name()来訪问私有的变量和方法。
单例模式是指创建唯一对象吗,单例模式设计的类仅仅能实例化一个对象。比如以下的代码:
if ZZClass.__instance is None: #生产唯一实例
print("ZZClass __new__ called.")
ZZClass.__instance = object.__new__(cls,*args,**kwargs)
return ZZClass.__instance
比如。fruit.color将转换为fruit.__getattr__(color)。
当使用赋值语句对属性进行设置时,python会自己主动调用__setattr__()方法。__getattribute__()的功能与__getattr__()类似,用于获取属性的值。
可是__getattribute__()能提供更好的控制。代码更健壮。注意,python中并不存在__setattribute__()方法。
这样就把对象和字符串关联起来。便于某些程序的实现。能够用这个字符串来表示某个类。
return "ZZClass itself."
def __call__(self, *args, **kwargs):
print "internal class."
func = InternalClass() # 调用InternalClass()。此时将类InternalClass作为函数返回,
# 即为外部类ZZClass定义方法func(),func()将运行__call__()内的代码。
myObj.func() #internal
class.
def __getitem__(self, item):
return self.persons[item]
allPersons = Persons()
allPersons.persons = ["Alice","Joe"]
print allPersons[1]
一种总是强制类型定义的语言,Java和Python是强制类型定义的,假设你有一个整数。不显示地进行转换。不能将其视为一个字符串。
一种类型能够被忽略的语言。与强类型定义相反。VBScript是弱类型定义 的。在VBScript中,能够将字符串
'12' 和整数 3 进行连接得到字符串 '123', 然后能够把它看成整数 123。而不须要显示转换。
注意:强弱类型中心词是‘类型’。而不是变量,一个变量是否可以绑定到多种类型,跟该语言是否强弱类型无关。
编译程序在编译阶段并不能确切知道将要调用的函数,仅仅有在程序执行时才干确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序执行时进行,这样的在程序执行时进行联编工作被称为动态联编。
Python -面向对象(一 基本概念)的更多相关文章
- python面向对象编程 -- 基本概念
面向对象的编程简要概括就是将要处理的问题抽象为数据和操作的集合,用类对其进行封装.其中数据和操作都称为类的属性,它们是一般是不变的. 对类进行实例化生成我们所说的对象,对象有自己的属性.对象的属性一般 ...
- python 面向对象的基本概念(未完待续)
面向对象编程简称OOP(Object-oriented-programming),是一种程序设计思想. 面向过程编程(如C语言)指一件事该怎么做,面向对象编程(如Java.python)指一件事该让谁 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- Python 面向对象笔记
Python 面向对象课程笔记 前言 Python 面向对象 正文 基本概念 什么是对象: 万物皆对象 对象是具体物体: 拥有属性 拥有行为 封装零散为整体 OOP(Object Oriented P ...
- python面向对象基本概念(OOP)
面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...
- python面向对象编程(1)——基本概念,术语,self,构造器
1 python面向对象命名规范 类名通常由大写字母打头.这是惯例标准. 数据值应该使用名词作为名字,方法使用动词加对象的方式,若使用混合记法,则方法名的第一个字母首字母小写,后面的单词的首字母大写 ...
- 【python】-- 面向对象引子、概念
面向过程编程 1.编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马 ...
- python 面向对象初级篇
Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...
- python 面向对象学习
------Python面向对象初 下面写一个类的简单实用,以便方便理解类 #python 3.5环境,解释器在linux需要改变 #阅读手册查询readme文件 #作者:S12-陈金彭 class ...
- python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异
1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html 1.__init__() 创建对 ...
随机推荐
- mybatis批量插入:oracle和mysql的区别
一.oracle批量插入 <insert id="save" parameterType="java.util.List"> insert into ...
- Eclipse、svn插件、subclipse的安装
1.下载subclipse的安装包 URL:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 ...
- Winfrom 使用TabControl控件模拟程序向导步骤
.NET : 隐藏TabControl的标签栏 在给应用程序添加一个向导的做法有很多,但其中比较简便易行的是使用TabControl.如下图所示 但有一个小小的美中不足,就是:作为向导而言,我们可 ...
- xmodmap使用指南
什么是 xmodmap 改变按键的行为 修改修饰键的行为 修改鼠标按键行为 Fvwm中的修辞键使用 1. 什么是 xmodmap xmodmap 是一个在 X 图形环境下用于修改键盘和鼠标按钮映射的工 ...
- 如何监控Oracle
介绍了DBA每天在监控Oracle数据库方面的职责,讲述了如何通过shell脚本来完成这些重复的监控工作.本文首先回顾了一些DBA常用的Unix命令,以及解释了如何通过Unix Cron来定时执行DB ...
- Android APP内存优化之图片优化
网上有很多大拿分享的关于Android性能优化的文章,主要是通过各种工具分析,使用合理的技巧优化APP的体验,提升APP的流畅度,但关于内存优化的文章很少有看到.在Android设备内存动不动就上G的 ...
- stylus使用文档总结:选择器+变量+插值+运算符+混合书写+方法
建立好项目后我们来安装stylus npm install stylus stylus-loader --save-dev 这样就安装上了stylus. 接下来就可以使用了,使用方式分两种.一种是在. ...
- Shiro(4)默认鉴权与自定义鉴权
=========默认鉴权======== 过滤链中定义: <!-- 过滤链定义 --> <property name="filterChainDefinitions&qu ...
- pip安装scrapy时报错:error: Unable to find vcvarsall.bat
网上一堆胡说八道的,请看微软官方文章: https://blogs.msdn.microsoft.com/pythonengineering/2016/04/11/unable-to-find-vcv ...
- 猫猫学iOS之UITextField右边设置图片,以及UITextField全解
猫猫分享,必须精品 原创文章.欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 效果: 封装好的方法: 猫猫封装的一个小方法,简单共享出来,方便 ...