一、Python经典类与新类
经典类:如果没有直接或间接的子类化一个对象,也就是说如果没有指定一个父类,或者是如果子类化的基本类没有父类,那么就定义了经典类:
class classics: 'define a classics Class' pass
新式类:与经典类相反。object是“所有类之母”,也就是基类,如果你的类没有继承任何父类,object将作为默认的父类:
class newClass(object): 'define a classics Class' pass
二、Python的实例化
创建一个实例的过程叫实例化,在其他编程语言中一般用关键字 new ,但是在Python中没有这个关键字。而是类似函数调用的方式创建实例的:
class newClass(object): pass inst = newClass() print inst #<__main__.newClass object at 0x00B71650>
三、类最简单的用法
类最简单的用法仅仅用作名称空间,意味着将数据保存到变量中,使用句点属性标识对它们按名称空间分组。
class newClass(object): pass bar = newClass() #创建实例 bar.x = 1 #创建实例属性 bar.y = 2 print bar.x+bar.y
注意:bar.x ,bar.y 是实例对象的属性不是类的属性。
四、方法
方法就是类的功能
方法在类中定义,只能被实例调用。
在类中,方法有一个默认参数self,这个参数代表实例本身,当用实例调用方法时,由解释器悄悄传递给方法。
class newClass(object): def method(self): return self bar = newClass() print bar.method() #<__main__.newClass object at 0x00B71910>
在其他语言中,self一般称为this,一般方法会用到这个实例(self),但是静态方法和类方法不需要。
五、创建类、方法、实例对象访问
class addPerson(object): def __init__(self,nm,ph): #定义构造器 self.name = nm #设置name self.phone = ph #设置phone print 'Created instance for',self.name def updatePhone(self,newph): self.phone = newph print 'Updated phone for',self.phone josn = addPerson(') #创建实例对象josn ben = addPerson(') #创建实例对象ben print 'Instance property:[%s][%s]' %(ben.name,ben.phone) #访问实例属性 ben.updatePhone(') print ben.phone
六、子类
创建子类:靠继承来进行子类化,在不影响父类(基类)的基础上改进自己的功能。
如:继承上面的类
class addInfo(addPerson): def __init__(self,nm,ph,id,em): #定义自己的构造器 addPerson.__init__(self, nm, ph) #继承父类构造器(这个很重要) self.empid = id self.email = em def updateEmail(self,newem): self.email = newem print 'Updated e-mail address for:',self.name zhangsan = addInfo(','ZhangSan@gmail') #创建addInfo实例,输出Created instance for ZhangSan print zhangsan #<__main__.addInfo object at 0x00B71BD0> print 'Instance property:[%s],[%s],[%s],[%s]' %(zhangsan.name,zhangsan.phone,zhangsan.empid,zhangsan.email) #输出:Instance property:[ZhangSan],[123456789],[01],[ZhangSan@gmail] zhangsan.updatePhone(') #Updated phone for 250 zhangsan.updateEmail('Zhang@163.com') #Updated e-mail address for: ZhangSan
注意:
如果需要,每个子类最好定义自己的构造器,不然的话,基类的构造器将会被调用。然而如果子类重写基类的构造器,那么基类的构造器就不会被自动调用,必须显式写出来才行,如上的:addPerson.__init__