1,什么是继承python
继承是一种建立新类的方式,在python中,新建的类能够继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类ide
2,python中类的继承分为:单继承和多继承函数
2.1,定义类时,类名后面的括号是用来代表关系的,不是用来传参的。spa
class ParentClass1: #定义父类
pass
class ParentClass2: #定义父类
pass
class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
pass
class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
pass
2.2,查看继承code
>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看全部继承的父类
(<class '__main__.ParentClass1'>,)
>>> SubClass2.__bases__
(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
>>>ParentClass1.__bases__
(<class 'object'>,) #任何一个没有父类的类都是object的子类。python3中没有继承的默认继承object类。
3,在定义类时,在默认执行__init__(self)以前,就会默认创建了一个空白对象self。对象
class Animal:
def __init__(self):
print('执行Animal.__init__')
self.func()
class Dog(Animal):
def func(self):
print('Dog.func')
dog = Dog()
# 结果
# 执行Animal.__init__
# Dog.func
4,继承blog
在开发程序的过程当中,若是咱们定义了一个类A,而后又想新创建另一个类B,可是类B的大部份内容与类A的相同时
咱们不可能从头开始写一个类B,这就用到了类的继承的概念。
经过继承的方式新建类B,让B继承A,B会‘遗传’A的全部属性(数据属性和函数属性),实现代码重用继承
class Animal:
'''
人和狗都是动物,因此创造一个Animal基类
'''
def __init__(self, name, aggressivity, life_value):
self.name = name # 人和狗都有本身的昵称;
self.aggressivity = aggressivity # 人和狗都有本身的攻击力;
self.life_value = life_value # 人和狗都有本身的生命值;
def eat(self):
print('%s is eating'%self.name)
class Dog(Animal):
pass
class Person(Animal):
pass
egg = Person('egon',10,1000)
ha2 = Dog('二愣子',50,1000)
egg.eat()
ha2.eat()
5,supperci
class A:
def hahaha(self):
print('A')
class B(A):
def hahaha(self):
super().hahaha() # “supper(类名,对象名).方法名” #super(B,self).hahaha(),
# 在本类中参数能够不写,默认传本类的类名和对象。 此方法也可用于类外。
# A.hahaha(self) # 用调用普通函数的方式(同上句)
print('B')
a = A()
b = B()
b.hahaha()
super(B,b).hahaha()
6,派生开发
class Animal:
'''
人和狗都是动物,因此创造一个Animal基类
'''
def __init__(self, name, aggressivity, life_value):
self.name = name # 人和狗都有本身的昵称;
self.aggressivity = aggressivity # 人和狗都有本身的攻击力;
self.life_value = life_value # 人和狗都有本身的生命值;
def eat(self):
print('%s is eating'%self.name)
class Dog(Animal):
'''
狗类,继承Animal类
'''
def __init__(self,name,breed,aggressivity,life_value):
super().__init__(name, aggressivity, life_value) #执行父类Animal的init方法
self.breed = breed #派生出了新的属性
def bite(self, people):
'''
派生出了新的技能:狗有咬人的技能
:param people:
'''
people.life_value -= self.aggressivity
def eat(self):
# Animal.eat(self)
#super().eat()
print('from Dog')
class Person(Animal):
'''
人类,继承Animal
'''
def __init__(self,name,aggressivity, life_value,money):
#Animal.__init__(self, name, aggressivity, life_value)
#super(Person, self).__init__(name, aggressivity, life_value)
super().__init__(name,aggressivity, life_value) #执行父类的init方法
self.money = money #派生出了新的属性
def attack(self, dog):
'''
派生出了新的技能:人有攻击的技能
:param dog:
'''
dog.life_value -= self.aggressivity
def eat(self):
#super().eat()
Animal.eat(self) #若是既想实现新的功能也想使用父类本来的功能,还须要在子类中再调用父类
print('from Person')
egg = Person('egon',10,1000,600)
ha2 = Dog('二愣子','哈士奇',10,1000)
print(egg.name)
print(ha2.name)
egg.eat()
7,继承顺序
8,多继承中的砖石继承
# 父类中没有的属性 在子类中出现 叫作派生属性class Weapon:
def prick(self, obj): # 这是该装备的主动技能,扎死对方
obj.life_value -= 500 # 假设攻击力是500
class Person: # 定义一我的类
role = 'person' # 人的角色属性都是人
def __init__(self, name):
self.name = name # 每个角色都有本身的昵称;
self.weapon = Weapon() # 给角色绑定一个武器;
egg = Person('egon')
egg.weapon.prick()
#egg组合了一个武器的对象,能够直接egg.weapon来使用组合类中的全部方法
9.2,圆环计算组合
圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
这个时候,咱们就首先实现一个圆形类,计算一个圆的周长和面积。而后在"环形类"中组合圆形的实例做为本身的属性来用
from math import pi class Circle: ''' 定义了一个圆形类; 提供计算面积(area)和周长(perimeter)的方法 '''
def __init__(self,radius): self.radius = radius def area(self): return pi * self.radius * self.radius def perimeter(self): return 2 * pi *self.radius circle = Circle(10) #实例化一个圆
area1 = circle.area() #计算圆面积
per1 = circle.perimeter() #计算圆周长
print(area1,per1) #打印圆面积和周长
class Ring: ''' 定义了一个圆环类 提供圆环的面积和周长的方法 '''
def __init__(self,radius_outside,radius_inside): self.outsid_circle = Circle(radius_outside) self.inside_circle = Circle(radius_inside) def area(self): return self.outsid_circle.area() - self.inside_circle.area() def perimeter(self): return self.outsid_circle.perimeter() + self.inside_circle.perimeter() ring = Ring(10,5) #实例化一个环形
print(ring.perimeter()) #计算环形的周长
print(ring.area()) #计算环形的面积
9.3,能够先实例化在传给属性
用组合的方式创建了类与组合的类之间的关系,它是一种‘有’的关系,好比教授有生日,教授教python课程
class BirthDate: def __init__(self,year,month,day): self.year=year self.month=month self.day=day class Couse: def __init__(self,name,price,period): self.name=name self.price=price self.period=period class Teacher: def __init__(self,name,gender,birth,course): self.name=name self.gender=gender self.birth=birth self.course=course def teach(self): print('teaching') p1=Teacher('egon','male', BirthDate('1995','1','27'), Couse('python','28000','4 months') ) print(p1.birth.year,p1.birth.month,p1.birth.day) print(p1.course.name,p1.course.price,p1.course.period) ''' 运行结果: 1 27 python 28000 4 months '''