属性初始化:
一定要用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属性