首页 > 代码库 > Python -面向对象(一 基本概念)
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() #通过实例调用类方法
构造方法支持重载,假设用户自己没有又一次定义构造方法,系统就自己主动运行默认的构造方法。
类变量是全部对象共享的,不须要对象。能够直接用“类名.变量名”訪问,与C++一样,使用对象实例也能够訪问类变量。实例变量是每一个对象一个拷贝,仅仅能通过对象訪问,实例变量是不须要在类中显示定义的。
但这一改动方式将对该类变量实例化,其结果是该实例将得到一个单独的该变量拷贝,此后此对象不再与类共享该名称的变量。(这一点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
静态函数仅仅能訪问静态成员变量(类变量)。与C++一样,能够使用实例对象和类名来调用静态函数,仅仅能使用实例变量来调用普通函数。
与静态方法使用类似。他们都能够通过类和实例进行调用,都无法訪问实例成员。
类方法能够通过自己的參数cls訪问类成员,而静态方法则不行,能够通过类名间接訪问。
staticmethod无需參数,classmethod须要类变量作为參数传递(不是类的实例)。类函数另一个用途就是能够对类属性进行改动。
但这个实际上是python的伪私有,仅仅是一种程序猿约定俗称的规定。加了双下划线就表示私有变量,可是假设要在外部调用的话,还是能够调用的。看以下的样例:
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,而不须要显示转换。
注意:强弱类型中心词是‘类型’,而不是变量,一个变量是否可以绑定到多种类型,跟该语言是否强弱类型无关。
函数的执行效率没有静态联编的高,但比其灵活。
Python -面向对象(一 基本概念)