面向對象的三大特性之多態,封裝基礎

面向對象的三大特性  :  繼承    多態    封裝

  多態:一個類表現出多種形態:經過繼承來實現的

在python中:因爲函數的參數不須要指定數據類型,因此也不須要經過繼承的形式來統一一組類的類型python

  換句話說,全部的對象都有有一個共同的父類(object),即類型均可以是object類型,因此python中到處是多態。編程

在Java中:在一個函數中須要給參數指定數據類型,若是這個地方能夠接受倆個以上的類型的參數,那麼這些類型都應該定義一個共同的父類,這個父類是因此子類對象的類型。安全

    就是運用多態來解決傳參數的時候,數據類型的規範問題。函數

  鴨子類型:指若是看起來像,叫聲像鴨子,那麼它就是鴨子

    不是明確的經過繼承實現的多態。而是經過一個模糊的概念來 判斷這個函數能不能接受這個類型的參數。spa

  例:利用標準庫中定義的各類「與文件相似」的對象,儘管這些對象的工做方式像文件,但他們沒有繼承內置文件對象的處理方法code

封裝:

  封裝的好處:將變化隔離;便於使用;提升複用性;提升安全性對象

  封裝的原則:將不須要對外提供的內容都隱藏起來,把屬性隱藏,提供公共方法對其訪問blog

  廣義上的封裝:就是把屬性函數(打包)都放在類裏,方便類的對象進行調用

  就是隻有這個類實例化的對象才能使用類中的方法繼承

  狹義上的封裝:就是私有的

class Goods:
    __discout = 0   #在類中定義私有的   就是 __變量名    這樣的格式
    print(__discout)    #直接打印  0
# print(Goods.__discount)     #報錯。說明在類的外部不能直接引用私有的靜態變量
print(Goods.__dict__)       #能夠經過查看類中的全部屬性和方法   找到'_Goods__discout': 0,
print(Goods._Goods__discout)    #打印  出  0  從編程規範的角度上來講,咱們不能再類的外部使用
                         私有的變量
 

    類中的靜態變量和方法名在程序的加載過程當中就已經執行完了,而不是在調用的時候才加載內存

    當類中全部的屬性加載完以後,纔在內存中顯示出這個類的名字。

    私有的靜態屬性能夠在類的內部直接使用,它的做用就是爲了隱藏某個變量的值

 

class Student:
    def __init__(self,name,age):
        self.__name = name
        self.age = age
    def name(self):     #能夠經過方法來查看私有的屬性
        return self.__name
l1 = Student("alex",18)
print(l1.name())        #經過調用方法來顯示私有變量的內容
class Goods:
    __discount = 0.7
    def __init__(self,name,price):
        self.name = name
        self.__price = price
    @property       #property 是一個裝飾器函數  調用的這個方法的時候就能夠再也不方法後面加()  自我理解
    def price(self):
        return self.__price * self.__discount
    def change_price(self,new_price):
        if type(new_price) is int:
            self.__price = new_price        #私有的變量只能在內部經過方法來進行修改
        else:
            print("本次價格修改不成功")
a1 = Goods("蘋果",5)
print(a1.price)    #3.5   #經過裝飾器後,這裏就能夠不加括號
a1.change_price(8)  #調用方法修改私有的變量
print(a1.price)     #5.6

類中的私有成員:

  私有的靜態屬性  (__name = "alex")

  私有的對象屬性  (self.__name = name)

  私有的方法  (父類不想讓子類覆蓋本身的方法,能夠將方法定義爲私有的)

class User:
    __nationality = "China"     #私有靜態屬性
    def __init__(self,name,pwd):
        self.name = name
        self.__pwd = pwd        #私有的對象屬性
        self.pwd = self.__getpwd()
    def __getpwd(self):         #私有的方法
        return hash(self.__pwd)
    @property
    def nationality(self):
        return User.__nationality
obj = User("alex","alex123")
print(obj.nationality,obj.name,obj.pwd)     #China alex -1388251584925158483

我爲何要定義一個私有變量?:

  我不想讓你看到這個值

  我不想讓你修改這個值

  我想讓你在修改這個值的時候有一些限制

  有些方法或者屬性不但願被子類繼承

私有變量不能再外部被定義:

  例:

class A:
    __county = "China"  #在類的內部會發生變形    變成了_A__county
    print(__county)
A.__Language = "Chinese"    #這個只是在類中增長了一個靜態屬性
print(A.__dict__)   
print(A.__Language)

私有變量不能被繼承(可使用(按照規範又不能這樣作))

  

class A:
    __county = "China"
    def __init__(self,name):
        self.__name = name
class B(A):
    # print(__county)     #報錯NameError: name '_B__county' is not defined
    print(A._A__county)     #就是經過類名去調用的
    def get_name(self):
        return self.__name
b = B("alex")
print(b._A__county)     #China
print(b.__dict__)   #{'_A__name': 'alex'}
相關文章
相關標籤/搜索