(1)类的继承
- 函数super(Student, self)将返回当前类继承的父类,即 Person
- 然后调用init()方法,注意self参数已在super()中传入,在init()中将隐式传递,不需要写出(也不能写)
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
s = Student("zhangsan","man",76)
print s.name
print s.gender
print s.score
(2)类型判断
- 函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型
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')
print isinstance(p,Person) # True
print isinstance(p,Student) # False
print isinstance(p,Teacher) # False
print isinstance(p,object) # True
print isinstance(s,Person) # True
print isinstance(s,Student) # True
print isinstance(s,Teacher) # False
print isinstance(s,object) # True
print isinstance(t,Person) # True
print isinstance(t,Student) # False
print isinstance(t,Teacher) # True
print isinstance(t,object) # True
>>> type(123)
<type 'int'>
>>> s = Student('Bob', 'Male', 88)
>>> type(s)
<class '__main__.Student'>
>>> dir(123) # 整数也有很多属性...
['__abs__', '__add__', '__and__', '__class__', '__cmp__', ...]
>>> 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']
(3)继承的多态
- 调用 xx.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
p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')
print p.whoAmI() # I am a Person, my name is Tim
print s.whoAmI() # I am a Student, my name is Bob
print t.whoAmI() # I am a Teacher, my name is Alice
(4)多重继承
- 多重继承通过 super()调用init()方法时,A 虽然被继承了两次,但init()只调用一次:
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…'
>>> d = D('d')
init A...
init C...
init B...
init D...
网友评论