属性初始化:

一定要用super(Teacher, self).__init__(name, gender)去初始化父类,否则,继承自 Person 的 Teacher 将没有 name 和 gender。

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

class Teacher(Person):
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course

t = Teacher('Alice', 'Female', 'English')
print t.name
print t.course

函数super(Teacher, self)将返回当前类继承的父类,即 Person ,然后调用__init__()方法,注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)

类型判断:

函数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

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

print isinstance(t, Person)      # True
print isinstance(t, Student)     # False
print isinstance(t, Teacher)     # True
print isinstance(t, object)      # True

可以观察出在一条继承链上,一个实例可以看成它本身的类型,也可以看成它父类的类型。

多态:

Python中的多态是指,在子类中构建和父类同名的方法。这时子类实际上拥有自己的方法以及从 父类继承的同名方法,但通过子类调用该方法时总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止

由于Python是动态语言,所以,传递给方法的参数不一定是子类或者父类的类型。任何数据类型的实例都可以,只要它有一个同名的方法即可。

多继承:

除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。

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

获取对象信息:

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

type(123)   # <type 'int'>
s = Student('Bob', 'Male', 88)
type(s)     # <class '__main__.Student'>

其次,可以用 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']
'''

去掉__xxx__这类的特殊属性,只保留自己定义的属性。使用filter()函数:

print filter(lambda x: x[0]!='_', dir(s))

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

getattr(s, 'name')  # 获取name属性 'Bob'
setattr(s, 'name', 'Adam')  # 设置新的name属性