在学习C#和JavaScript的时候,都有接触过面向对象的编程,python中的面向对象也和他们类似,这里主要列出一些不一样的部分。(主要和JavaScript进行比较)
python中面对对象的一些术语
面向对象的两个方面:
- 类:创建的新类型
- 对象:类的实例
域: 一个对象和类的变量。域的两种类型:
- 实例变量:属于每个实例的域
- 类变量:属于类的对象或属于类本身的域
方法:一个对象和类的函数
类
一个简单的类
Python class Person():
"""
一个简单的类定义
"""
def __init__(self,name):
"""
__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化
"""
self.name = name
def sayHello(self):
"""
类/对象可以拥有像函数一样的方法,这些方法与函数的区别只是一个额外的self变量。
"""
print 'hello,',self.name
sliuqin = Person('sliuqin') #创建一个Person实例。
sliuqin.sayHello()#==> sliuqin
self
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,这个特别的变量指对象本身,按照惯例它的名称是self。
python 中的self,等价于JavaScript中的this
__init__
__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。注意,这个名称的开始和结尾都是双下划线。
__init__方法类似于C#中的 constructor 。
使用类和实例的变量
Python
class Person():
"""
一个简单的类定义
"""
#类的变量,类的所有对象(实例)共享使用。
totalNum = 0
def __init__(self,name):
"""
__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化
"""
#对象到变量,由类的每个对象(实例)拥有。
self.name = name
#使用类变量。
Person.totalNum +=1 #==> self.__class__.totalNum +=1
def sayHello(self):
"""
类/对象可以拥有像函数一样的方法,这些方法与函数的区别只是一个额外的self变量。
"""
print 'hello,',self.name
sliuqin = Person('sliuqin') #创建一个Person实例。
sliuqin.sayHello()#==> sliuqin
jerry = Person('jerry')
#类变量
print jerry.totalNum #==> 2
上文已经讲到:有两种中类型的域,
- 类的变量 由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。
- 对象的变量 由类的每个对象/实例拥有。因此每个对象有自己对这个域的一份拷贝,即它们不是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,但是是互不相关的。通过一个例子会使这个易于理解。
__class__
__class__ 是每个类实例的一个内置属性 (也是每个类的)。它是一个类的引用,而 self 是一个类的实例。所以上述代码中#使用类变量 ,可以使用self.__class__.totalNum 来代替Person.totalNum 。
继承
Python
class WD(Person):
"""
继承示例
"""
def __init__(self,name,skill):
Person.__init__(self, name)
self.skill = skill
def getSkill(self):
print self.skill
jerrySheng = WD('jerry.sheng','python')
jerrySheng.sayHello() #==> hello,jerry.sheng
jerrySheng.getSkill() #==>python
【深入阅读】