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__() 创建对 ...
随机推荐
- windows和linux下杀死Tomcat进程,解决端口占用
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...
- #iOS问题记录# UITextview富文本链接,禁止长按事件
UITextView的富文本组装,添加图片点击事件,启动 - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *) ...
- 基本C库函数
当编写驱动程序时,一般情况下不能使用C标准库的函数.Linux内核也提供了与标准库函数功能相同的一些函数,但二者还是稍有差别. 类别 函数名 功能 函数形成 参数 描述 字符串转换 simple_st ...
- Oracle Form删除list项
Oracle From中的list项点击后就会新增一个下拉列,此时可以使用 Ctrl+shift+< 进行删除
- [UML] UML中类之间的几种关系
类之间可能存在以下几种关系:关联(association).依赖(dependency).聚合(Aggregation,也有的称聚集).组合(Composition).泛化(generalizatio ...
- Calico网络策略实践
因为Kubernetes官方用的flannel无法实现多租户环境下的网络隔离,建立起来的pod之间实际可以相互访问,而Calico可以实现,因此周末找个时间试了一下大概的过程. 前面的kubernet ...
- Intents and Intent Filters
An Intent is a messaging object you can use to request an action from another app component. Althoug ...
- iOS:quartz2D绘图(给图形绘制阴影)
quartz2D既可以绘制原始图形,也可以给原始图形绘制阴影. 绘制阴影时,需要的一些参数:上下文.阴影偏移量.阴影模糊系数 注意:在drawRect:方法中同时调用绘制同一个图形时,在对绘制的图形做 ...
- iOS:手势的详解UIGestureReconizer
手势类:UIGestureReconizer 父类: 手势状态枚举 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { UIGesture ...
- 取url中的参数值
string url = "https://i.cnblogs.com/EditPosts.aspx?opt=1";//key不区分大小string key="opt&q ...