一 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() #通过实例调用类方法
但这一改动方式将对该类变量实例化。其结果是该实例将得到一个单独的该变量拷贝。此后此对象不再与类共享该名称的变量。
(这一点Python有点复杂),看以下的样例:
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须要类变量作为參数传递(不是类的实例)。类函数另一个用途就是能够对类属性进行改动。
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__
b = Test(-1)
print b.count #1
print Test.count #2
单例模式是指创建唯一对象吗,单例模式设计的类仅仅能实例化一个对象。比如以下的代码:
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__()方法。
这样就把对象和字符串关联起来。便于某些程序的实现。能够用这个字符串来表示某个类。
def __call__(self, *args, **kwargs):
print "internal class."
func = InternalClass() # 调用InternalClass()。此时将类InternalClass作为函数返回,
# 即为外部类ZZClass定义方法func(),func()将运行__call__()内的代码。
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。而不须要显示转换。
注意:强弱类型中心词是‘类型’。而不是变量,一个变量是否可以绑定到多种类型,跟该语言是否强弱类型无关。