在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'}