python 面向对象学习总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
引言
提到面向对象,总是离不开几个重要的术语:多态(Polymorphism),继承(Inheritance)
和封装(Encapsulation)。Python也是一种支持OOP的动态语言,本文将简单阐述Python 对面向对象的支持。
在讨论Python的OOP之前,先看几个OOP术语的定义:
类:对具有相同数据和方法的一组对象的描述或定义。
对象:对象是一个类的实例。
实例(instance):一个对象的实例化实现。
标识(identity):每个对象的实例都需要一个可以唯一标识这个实例的标记。
实例属性(instance attribute):一个对象就是一组属性的集合。
实例方法(instance method):所有存取或者更新对象某个实例一条或者多条属性的函数的集合。
类属性(classattribute):属于一个类中所有对象的属性,不会只在某个实例上
发生变化
类方法(classmethod):那些无须特定的对性实例就能够工作的从属于类的函数。中的类与对象
Python中定义类的方式比较简单:
class 类名:
类变量
def __init__(self,paramers):
def 函数(self,...)
其中直接定义在类体中的变量叫类变量,而在类的方法中定义的变量叫实例变量。类的属性包括成员变量和方法,其中方法的定义和普通函数的定义非常类似,但方法必须以self 作为第一个参数。
举例:
class MyFirstTestClass:
classSpec="it is a test class"
def __init__(self,word):
print "say "+word
def hello(self,name):
print "hello "+name
在Python类中定义的方法通常有三种:实例方法,类方法以及静态方法。这三者之间的区别是实例方法一般都以self作为第一个参数,必须和具体的对象实例进行绑定才能访问,而类方法以cls作为第一个参数,cls表示类本身,定义时使用@classmethod;而静态方法
不需要默认的任何参数,跟一般的普通函数类似.定义的时候使用@staticmethod。
class MethodTest():
count= 0
def addCount(self):
+=1
print "I am an instance method,my count is" + str, self
@staticmethod
defstaticMethodAdd():
+=1
print"I am a static methond,my count is"+str
@classmethod
defclassMethodAdd(cls):
+=1
print"I am a class method,my count is"+str,cls
a=MethodTest()
()
'''I am an instance method,my count is 1 < instanceat 0x011EC990>
'''
() ;#I am a static methond,my count is2
() ;#I am a static methond,my count is3
() ;#I am a class method,my count is4
() ;#I am a class method,my count is5
()
'''Traceback(most recent call last):
File"
()
TypeError:unbound method addCount() must be called with MethodTest instance asfirst argument (got nothing instead)
'''
从上面的例子来看,静态方法和类方法基本上区别不大,特别是有Java编程基础的人会
简单的认为静态方法和类方法就是一回事,可是在Python中事实是这样的吗看下面的例子:() ;#I am a class method,my count is5
class subMethodTest(MethodTest):
pass
b=subMethodTest()
() ;#I am a static methond,my count is6
() ;#I am a class method,my count is7
() ;#Iam a class method,my count is8
如果父类中定义有静态方法a(),在子类中没有覆盖该方法的话,()仍然指的是父类的a ()方法。而如果a()是类方法的情况下,()指向的是子类。@staticmethod只适用于不想定义全局函数的情况。
看看两者的具体定义:
@staticmethod function is nothing morethan a function defined inside a class. It is callable withoutinstantiating the class first. It’s definition is immutable viainheritance.