python面向对象的组合用法
代码的重复利用除了继承还有另外的一种方式,就是:组合
组合:在一个类中以另外一个类的对我峡谷作为数据属性,称为类的组合
例如:计算圆环的面积:
最开始:我们不使用组合:
from math import pi
class circle:
def __init__(self, r):
self.r = r
def circle_area(self):
return pi*self.r**2
def circle_permeter(self):
return 2*pi*self.r
class ring:
def __init__(self, out_r, in_r):
self.out_r = out_r
self.in_r = in_r
def ring_area(self):
return pi*self.out_r**2 - pi*self.in_r**2
def ring__permeter(self):
return pi * self.out_r * 2 - pi * self.in_r * 2
ring1 = ring(5, 3)
print(ring1.ring__permeter())
print(ring1.ring_area())
使用组合用法:
from math import pi
class circle:
def __init__(self, r):
self.r = r
def circle_area(self):
return pi*self.r**2
def circle_permeter(self):
return 2*pi*self.r
class ring:
def __init__(self, out_circle, in_circle):
self.out_circle = circle(out_circle)
self.in_circle = circle(in_circle)
def ring_area(self):
return self.out_circle.circle_area() - self.in_circle.circle_area()
def ring__permeter(self):
return self.out_circle.circle_permeter() - self.in_circle.circle_permeter()
ring1 = ring(5, 3)
print(ring1.ring__permeter())
print(ring1.ring_area())
组合的两种方式:
1.在__init__方法里面组合
class BirthDate:
def __init__(self,year,month,day):
self.year=year
self.month = month
self.day = day
class Course:
def __init__(self,name,price,period): #period为周期
self.name =name
self.price = price
self.period = period
class Teacher:
def __init__(self,name,salary,year,month,day,price,period): #那么这个里面也要把该有的属性传进去
self.birth = BirthDate(year,month,day) #在里面组合(将BirthDate里面有的属性传入进去)
self.course=Course(name,price,period)
self.name = name
self.salary = salary
# 实例化方法一:
egg = Teacher('egon',2000,1999,12,2,'6 months','15800') #也要实例化,Teacher类里面的属性都得实例化
print(egg.birth.month) #当然老师也有生日,就让egg.birth.month
print(egg.course.period)
# 实例化方法二:
egg.birth=BirthDate(1996,22,4)
print(egg.birth.month)
在__init__里面组合
2.在外面组合
class BirthDate:
def __init__(self,year,month,day):
self.year=year
self.month = month
self.day = day
class Course:
def __init__(self,name,price,period): #period为周期
self.name =name
self.price = price
self.period = period
class Teacher:
def __init__(self,name,salary,course):
self.name = name
self.salary = salary
self.course = course
#
# #在外面组合。(组合就是一个类的属性是另一个类的对象)
egg = Teacher('egon',2000,'python')
egg.birth=BirthDate(1996,22,4) #直接给egg一个birth的属性,
print(egg.birth.year)
egg.course =Course('python','6 months',15800)
print(egg.course.period)
在类外面实例化组合