类的继承与派生
继承是指类与类之间的关系,用来解决代码重用,类可继承一个或多个父类,父类又可以成为基类或超类,新建类称为派生类或子类
class OldboyStudent: # 父类
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def learn(self):
print('%s is learn' % self.name)
def eat(self):
print('%s is eating' % self.name)
def sleep(self):
print('%s is sleeping' % self.name)
class ParentClass: # 父类
pass
class SubClass(ParentClass): # 单继承,基类是ParentClass,派生类是SubClass
pass
class SubClass2(ParentClass, OldboyStudent): python支持多继承,用逗号分隔开多个继承的类
pass
s1 = OldboyStudent('李坦克', '男', 18)
OldboyStudent.eat(s1)
s1.eat() # OldboyStudent.eat(s1) 与 s1.eat()等效,都是绑定s1到方法eat,
查看继承
SubClass.__bases__
(<class '__main__.ParentClass'>, <class '__main__.OldboyStudent'>)
SubClass.__base__
<class '__main__.ParentClass'>
__base__只查看从左到右继承的第一个子类,__bases__查看所有继承的父类(<class 'main.ParentClass1'>,)
经典类与新式类
1 只有在python2中才分新式类和经典类,python3统一都是新式类
2 在python2中,没有显示继承object类的类,以及该类的子类,都是经典类,反正都是新式类
3 在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类
print(ParentClass.__bases__) # obje是所有python类的基类,它提供了一些常用如 __str__的实现
(<class 'object'>,)
属性查找
示例代码
class Foo:
def f1(self):
print('Foo.f1')
def f2(self):
print('Foo.f2')
self.f1()
class Bar(Foo):
def f1(self):
print('Bar.f1')
b=Bar()
b.f2()
# 打印结果:
# Foo.f2
# Bar.f1
代码解析
b=Bar()先产生一个对象b,再通过__init__初始化对象b,类Bar作为一个派生类,含有基类Foo,它将继承Foo的数据及方法属性.b.f2()则将属性f2绑定到b,b将在自身属性里查找f2(),因为类Bar(Foo)并定制__init__,因此对象将不会拥有自己的属性,只能到类里面找
print(b.__dict__) # 执行后为空字典,找不到f2
{}
自身类不含f2,因此对象将从继承的基类F00里面找,找到f2,打印Foo.f2,在F00类中的f2()里,存在self.f1(),将f1()实例化绑定到b,相当于b.f1(),因此,对象b将从自身属性开始找,然后到它的类里找,终于找到了f1(),打印Bar.f1
派生
子类可以添加自己新的属性或者重新定义这些属性(不会影响到父类),一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。
在子类中,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self参数也要为其传值 class Foo: def init(self,name,age) self.name = name self.age = age def f1(self): print('Foo.f1')
def f2(self):
print('Foo.f2')
self.f1()
class Bar(Foo):
foo1 = 'foo'
def __init__(self,name,age):
Foo.__init__(self,name,age) # 调用父类函数
self.age1 = age # 新属性
def f1(self):
print('Bar.f1')
def f2(self):
print('Foo.f1') # 定义新方法
b = Bar('猪',18
)
b.f2()
print(b.age1)
# 结果
Foo.f1
18