1.语法:
class DerivedClassName(BaseClassName):
...
括号里为父类,也叫基类,子类可以继承父类的所有属性和方法
例如:
class Mylist(list):#list是父类,而Mylist是继承list的子类,它继承list的属性和方法
pass
l = Mylist()
>>> l.append(1)
>>> l
[1]
可以看出新类Mylist成功继承了list的方法
2.如果在子类中重写init方法,那么它所继承父类的方法会被覆盖
e.g.
class Fish:
def __init__(self):
self.x = r.randint(0,100)
self.y = r.randint(0,10)
def swim(self):
print('我在',self.x,self.y)
>>> class Jing(Fish):
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('我饿了,看看谁这么倒霉被窝吃掉~')
self.hungry = False
else:
print('饱了~')
接下来对类进行实例化,并调用其中的方法:
f = Fish()
>>> f.swim()
我在 0 4
然而。。。
j = Jing()
j.swim()
Traceback (most recent call last):
File "<pyshell#66>", line 1, in <module>
j.swim()
File "<pyshell#52>", line 6, in swim
print('我在',self.x,self.y)
AttributeError: 'Jing' object has no attribute 'x'
出错了。因为子类Jing继承Fish时重写了init方法,接下来改一下
1)
class Jing(Fish):
def __init__(self):
Fish.__init__(self)#新加了一行
self.hungry = True
def eat(self):
if self.hungry:
print('我饿了,看看谁这么倒霉被窝吃掉~')
self.hungry = False
else:
print('饱了~')
>>> j = Jing()
>>> j.swim()
我在 96 6
2)还可以利用super来继承,无需传self参数:
class Jing(Fish):
def __init__(self):
super().__init__()#新添加的语句
self.hungry = True
def eat(self):
if self.hungry:
print('我饿了,看看谁这么倒霉被窝吃掉~')
self.hungry = False
else:
print('饱了~')
>>> j = Jing()
>>> j.swim()
我在 23 2
super继承的优点:无需寻找父类名字,无需传入self参数,否则需要把所有父类名字找出来,有时可能比较麻烦
3)Python还支持多重继承,一个子类可以继承多个父类
class DerivedClassName(Base1,Base2,Base3):
.....
但是多重继承要慎重使用,有时可能会产生不可预测的bug