1:在版本2.2 中,Python社区最终统一了类型(type)和类(class),新式类具备更多高级的OOP特性,扮演了一个经典类(旧式类)超集的角色,后者是Python 诞生时所创造的类对象。
2:下面的示例展示了如何创建一个类:
class MyNewObjectType(bases):
'define MyNewObjectTypeclass'
class_suite
新式类和经典类声明的最大不同在于,所有新式类必须继承至少一个父类,参数bases可以是一个(单继承)或多个(多重继承)用于继承的父类。
object 是“所有类之母”。它位于所有类继承结构的最上层。如果你没有直接或间接的子类化一个对象,那么你就定义了一个经典类:
class MyNewObjectType:
'define MyNewObjectType classic class'
class_suite
很多Python类都还是经典类。即使经典类已经过时了,在以后的Python 版本中,仍然可以使用它们。不过我们强烈推荐你尽可能使用新式类。
3:使用类最简单的情况,类仅用作名称空间(namespaces)。这意味着你把数据保存在变量中,对他们按名称空间进行分组,使得他们处于同样的关系空间中。类似于C语言中的结构体(structures)一样的特性。
4:在类中定义方法:
class MyDataWithMethod(object):
def printFoo(self):
print 'You invoked printFoo()!'
self 参数代表实例对象本身,当用实例调用方法时,由解释器将该实例传递给方法。所以,不需要自己传递self 进来。一般的方法会需要这个实例(self),而静态方法或类方法不会。
实例化这个类,然后调用那个方法:
>>> myObj = MyDataWithMethod()
>>> myObj.printFoo()
You invoked printFoo()!
5:在Python 中,__init__()实际上不是一个构造器。Python 创建实例后,调用__init__()方法。
6:
class AddrBookEntry(object):
'address book entryclass'
def __init__(self, nm,ph):
self.name = nm
self.phone = ph
print 'Createdinstance for:', self.name
def updatePhone(self,newph):
self.phone =newph
print 'Updatedphone# for:', self.name
class EmplAddrBookEntry(AddrBookEntry):
'Employee Address BookEntry class'
def __init__(self, nm,ph, id, em):
AddrBookEntry.__init__(self, nm,ph)
self.empid = id
self.email = em
def updateEmail(self,newem):
self.email =newem
print 'Updatede-mail address for:', self.name
Python中,当一个类被派生出来,子类继承了基类的属性,所以,在上面的类中,我们不仅定义了__init__(),updatEmail()方法,而且EmplAddrBookEntry 还从AddrBookEntry 中继承了updatePhone()方法。
每个子类最好定义它自己的构造器__init__(),不然,基类的构造器会被调用。然而,如果子类重写基类的构造器,基类的构造器就不会被自动调用了--这样,基类的构造器就必须显式写出才会被执行,像我们上面那样,用AddrBookEntry.__init__()设置名字和电话号码。这里我们要显式传递self实例对象给基类构造器,因为我们不是在其实例中调用那个方法而是在一个子类实例中调用那个方法。
class father(object):
def __init__(self):
print 'this is father'
class child(father): pass
>>> c = child()
this is father
class father(object):
def __init__(self):
print 'this is father'
class child(father):
def __init__(self):
print 'this is child'
>>> c =test.child()
this is child
7:面向对象设计(OOD)不会特别要求面向对象编程语言。事实上,OOD 可以由纯结构化语言来实现,比如C。
考虑用OOD来工作的一个最重要的原因,在于它直接提供建模和解决现实世界问题和情形的途径。