Python接口与类继承学习-pybatis的准备阶段(九)

先说说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提示子类必须实现这两个函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值