1. 程式人生 > >python面向物件的組合用法

python面向物件的組合用法

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)

在類外面例項化組合