先说说py的继承。
为了使用继承,我们把基本类的名称作为一个元组跟在定义类时的类名称之后。然后,我们注意到基本类的__init__
方法专门使用self
变量调用,这样我们就可以初始化对象的基本类部分。这一点十分重要——Python不会自动调用基本类的constructor,你得亲自专门调用它。
'''
Created on 2013-3-11
@author: naughty
'''
class SchoolMember:
'''Represents any school member.'''
def __init__(self, name, age):
self.name = name
self.age = age
print '(Initialized SchoolMember: %s)' % self.name
def tell(self):
'''Tell my details.'''
print 'Name:"%s" Age:"%s"' % (self.name, self.age),
class Teacher(SchoolMember):
'''Represents a teacher.'''
def __init__(self, name, age, salary):
SchoolMember.__init__(self, name, age)
self.salary = salary
print '(Initialized Teacher: %s)' % self.name
def tell(self):
SchoolMember.tell(self)
print 'Salary: "%d"' % self.salary
class Student(SchoolMember):
'''Represents a student.'''
def __init__(self, name, age, marks):
SchoolMember.__init__(self, name, age)
self.marks = marks
print '(Initialized Student: %s)' % self.name
def tell(self):
SchoolMember.tell(self)
print 'Marks: "%d"' % self.marks
t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Swaroop', 22, 75)
members = [t, s]
for member in members:
#===========================================================================
# works for both Teachers and Students
#===========================================================================
member.tell()
上面的代码实现了teacher和student都继承自schoolmember。【这里的继承使用方式,使用了py2.2之前的方式。就是用父类的方法直接调用__init__方法。如果想写的好一点,可以使用super关键字。看这里。】
并且在teacher和student中都覆盖了schoolmember的tell方法。
需要注意的是,虽然两个子类覆盖了schoolmember的tell方法,但是在子类的tell方法中,还可以通过SchoolMember.tell(self)来调用父类的方法。这样就既能够执行父类的方法,也能够为自己执行一些其他功能了。比如输出学生的marks和老师的salary。
-------------------------------
另外,python是支持多重继承的。这个还没有具体研究过。【2013.3.30,在这篇文章中,有多重继承的描述,可以参考了】
--------------------------------
构造和析构:参见这里
py是不支持函数重载的。所以要想有多个构造函数,这是不可能的=。=
只能靠自己在写__init__的时候,根据参数来进行判断。
另外,py还有一个__new__内置函数。它的引进是为了让程序员控制实例的创建过程。并且这个方法只有python新风格类(或者新类)才会被调用。新类是以object为基类的类【这个在之前的文章中介绍过】。在链接中有例子证明了,在__new__中,去掉返回对象的语句,__init__就不会被调用了。
-------------------------------------------------
怎么构建一个自己的类似Java中toString函数?
在java中,tostring可以打印出来我们想要的类对象的信息。py中也有这个函数。那就是__str__。但是这个函数是不好的。因为比如说在类中定义了两个属性,name和age,然后在__str__中输出了这两个属性。然后在后来的实践中,又增加了一个score属性。那么原来定义的__str__函数就要同步修改,不然就不能完全体现对象中所有的属性了。
其实这里可以使用py的“内省”来做到臻于完美的。
看下面的代码:
t = Teacher('zoer', 40, 30000)
for at in list(t.__dict__):
print at,"-->",getattr(t,at)
我定义了一个Teacher,并且输出了Teacher中的所有属性。这个for循环就可以写在__str__函数中,作为一个通用的实现toString的方法来用。
-------------------------------------------------------------------
下面开始说接口。
其实py中没有接口这个概念。要想实现接口的功能,完全可以用一个空的类来做。
class sy():
def add(self):
pass
def remove(self):
pass
例如上面的代码,就可以看做是一个接口。然后让子类去实现add和remove函数。当然这里函数体可以使用pass,也可以使用raise或者assert提示子类必须实现这两个函数。