子类与父类是is
关系
s 是 Student
s 是 Person
has
关系,包含
继承一个类:
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
定义Student类,加上score属性:
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender) #有意思
self.score = score
#函数super(Student, self)将返回当前类继承的父类,即Person
#注意self已在Super中传入了,在__init__()中将隐式传递,不用再写
判断类型:
函数isinstance()
可以判断一个变量的类型,既可以用在Python内置数据类型如 str, list, dict等,也可以用在我们自定义的类中。
它们本质上都是数据类型。
子类实例是父类的实例,父类实例不是子类的实例
多态:
动态语言(如Python)与静态语言(如Java)最大的差别之一,动态语言调用实例方法不检查类型,只要方法存在,参数正确就可以调用。
一个父类与两个子类都定义了方法whoAmI(),实例 s 调用对应的方法——多态
多重继承:
class D(B, C):
def __init__(self, a):
super(D, self).__init__(a)
print 'init D...'
#也有人说这样不对,应该如下写:
class D(B, C):
def __init__(self, b, c):
B.__init__(self, b)
C.__init__(self, c)
#一看,第一种写法确实不太对哦
获取对象信息:
拿到一个变量除了用isinstance()
判断它是否是某种类型的实例外,
还有没有别的方法可以获取更多的信息?
*首先,用type()
函数是可以获取变量的类型的。
type(123)
==><type 'int'>
*其次,可用dir()
函数获取变量所有的属性
dir(123)
s = Student('Bob')
dir(s)
#dir返回的属性是字符串列表,如果已知一个属性名称,要获取设置对象的树形,就需要用 getattr() 和 setattr() 函数
getattr(s, 'name') #获取name属性
setattr(s, 'name', 'Adam') #设置
getattr(s, 'age') #不存在,报错
class Student(Person):
def __init__(self, name, **kw):
self.name = name
for k,v in kw.iteritems():
setattr(s, k, v)