您的位置:首页 > 编程语言 > Python开发

python知识-类的继承

2015-12-28 17:16 351 查看
class Person(Object):

    def __init__(self,name,gender):

        self.name=name

        self.gender=gender

class Student(Person):

    def __init__(self,name,gender,school,score):

        super(Student,self).__init__(name,gender)

        self.school=school

        self.score=score

继承的特点:

1.子类和父类是is关系

class Student(Person):

    pass

p=Person()

s=Student()

2.不要忘记调用super().__init__

判断类型

函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型

假设有如下的 Person、Student
Teacher 的定义及继承关系如下:

class Person(object):

    def __init__(self, name, gender):

        self.name = name

        self.gender = gender

class Student(Person):

    def __init__(self, name, gender, score):

        super(Student, self).__init__(name, gender)

        self.score = score

class Teacher(Person):

    def __init__(self, name, gender, course):

        super(Teacher, self).__init__(name, gender)

        self.course = course

p = Person('Tim', 'Male')

s = Student('Bob', 'Male', 88)

t = Teacher('Alice', 'Female', 'English')

 isinstance(p, Person)的结果为true

isinstance(s, Person)的结果为true

多态

类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 StudentTeacher ,并都写了一个 whoAmI() 方法:

class Person(object):

    def __init__(self, name, gender):

        self.name = name

        self.gender = gender

    def whoAmI(self):

        return 'I am a Person, my name is %s' % self.name

class Student(Person):

    def __init__(self, name, gender, score):

        super(Student, self).__init__(name, gender)

        self.score = score

    def whoAmI(self):

        return 'I am a Student, my name is %s' % self.name

class Teacher(Person):

    def __init__(self, name, gender, course):

        super(Teacher, self).__init__(name, gender)

        self.course = course

    def whoAmI(self):

        return 'I am a Teacher, my name is %s' % self.name

在一个函数中,如果我们接收一个变量 x,则无论该
x Person、Student还是 Teacher,都可以正确打印出结果:

def who_am_i(x):

    print x.whoAmI()

p = Person('Tim', 'Male')

s = Student('Bob', 'Male', 88)

t = Teacher('Alice', 'Female', 'English')

who_am_i(p)

who_am_i(s)

who_am_i(t)

这种行为称为多态。也就是说,方法调用将作用在
x 的实际类型上。sStudent类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。

多重继承

class A(object):

    def __init__(self, a):

        print 'init A...'

        self.a = a

class B(A):

    def __init__(self, a):

        super(B, self).__init__(a)

        print 'init B...'

class C(A):

    def __init__(self, a):

        super(C, self).__init__(a)

        print 'init C...'

class D(B, C):

    def __init__(self, a):

        super(D, self).__init__(a)

        print 'init D...'

像这样,同时继承自
BC,也就是 D 拥有了 A、B、C 的全部功能。多重继承通过 super()调用__init__()方法时,A 虽然被继承了两次,但__init__()只调用一次:

d = D('d')

init A...

init C...

init B...

init D...

获取对象信息

class Person(object):

    def __init__(self, name, gender):

        self.name = name

        self.gender = gender

class Student(Person):

    def __init__(self, name, gender, score):

        super(Student, self).__init__(name, gender)

        self.score = score

    def whoAmI(self):

        return 'I am a Student, my name is %s' % self.name

a.可以用 type() 函数获取变量的类型,它返回一个
Type 
对象:

s = Student('Bob', 'Male', 88)

type(s)

结果为:<class '__main__.Student'>

b.dir() 函数获取变量的所有属性:

dir(s)

结果为:['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', 'gender', 'name', 'score', 'whoAmI']

c.dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用
getattr() setattr( )函数了:

 getattr(s, 'name')  # 获取name属性

结果为:'Bob'

setattr(s, 'name', 'Adam')  # 设置新的name属性

 s.name

结果为:'Adam'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python