1. 程式人生 > >面向對象(三)組合、封裝

面向對象(三)組合、封裝

派生類 Go 訪問 對象 在外 level 除了 無法 子類

組合

之前我們有了解繼承是一種程序、軟件的重用方式,但是除了繼承之外還有一種方式可以讓其重用的重要方式——組合

組合指的是,在一個類中以另外一個類的對象作為數據屬性,稱為類的組合

# class OldboyPeople:
# def __init__(self,name,age,sex):
# self.name=name
# self.sex=sex
# self.age=age
# def tell_info(self):
# print(‘‘‘
# ============個人信息===========
# 姓名:%s
# 年齡:%s
# 性別:%s
# ‘‘‘%(self.name,self.age,self.sex))
# class Teacher(OldboyPeople):
# def __init__(self,name,age,sex,salary,level):
# super().__init__(name,age,sex)
# self.salary=salary
# self.level=level
# def teach(self):
# print(‘%s 講課‘%self.name)
# def tell_info(self):
# super().tell_info()
# print(‘‘‘
# 薪資:%s
# 級別:%s
# ‘‘‘%(self.salary,self.level))
#
# class Student(OldboyPeople):
# def choice(self):
# print(‘%s 選課‘%self.name)
#
# tea1=Teacher(‘egon‘,18,‘male‘,40,9)
# stu1=Student(‘alex‘,38,‘male‘)
#
# tea1.teach()
# tea1.tell_info()
# stu1.choice()
# stu1.tell_info()

組合與繼承都是有效地利用已有類的資源的重要方式。但是二者的概念和使用場景皆不同,

1.繼承的方式

通過繼承建立了派生類與基類之間的關系,它是一種‘是‘的關系,比如白馬是馬,人是動物。

當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好,比如老師是人,學生是人

2.組合的方式

用組合的方式建立了類與組合的類之間的關系,它是一種‘有’的關系,比如教授有生日,教授教python和linux課程,教授有學生s1、s2、s3...

當類之間有顯著不同,並且較小的類是較大的類所需要的組件時,用組合比較好

繼承是將程序之間的聯系更加緊密,而組合則是和面向對象的原則很像,讓它們之間耦合度變低

封裝

封裝從字面意思理解,裝是將一堆屬性存起來,封是將這些屬性隱藏起來,但是這種理解方式比較片面

封裝中隱藏的含義

隱藏的方法就是將屬性的前面加上__開頭(註意:沒有__結尾)

#其實這僅僅這是一種變形操作且僅僅只在類定義階段發生變形
#類中所有雙下劃線開頭的名稱如__x都會在類定義時自動變形成:_類名__x的形式:

class A:
    __N=0 #類的數據屬性就應該是共享的,但是語法上是可以把類的數據屬性設置成私有的如__N,會變形為_A__N
    def __init__(self):
        self.__X=10 #變形為self._A__X
    def
__foo(self): #變形為_A__foo print(from A) def bar(self): self.__foo() #只有在類內部才可以通過__foo的形式訪問到. #A._A__N是可以訪問到的, #這種,在外部是無法通過__x這個名字訪問到

1、為一個屬性名加__開頭,會在類定義階段將屬性名變形

變形:_自己的類名__屬性名(語法上的變形,不是真正的隱藏,對內不對外)

這種變形我們通過原屬性名是肯定無法調用,但是使用變形後的屬性名還是可以調用,但是這種調用沒有絲毫意義

2、這種語法意義的變形,只在定義階段發生一次,類定義之後,新增的__開頭的屬性不會產生效果

3、如果父類不想,讓子類覆蓋自己的方法,可以在方法名前加__開頭

面向對象(三)組合、封裝