隱藏對象的屬性和實現細節,只對外提供必要的方法。相當於將“細節封裝起來”, 只對外暴露“相關調用方法”,通過前面的“私有屬性、私有方法”的方式,實現“封裝”。
Python對於類的成員沒有嚴格的訪問控制限制,這與其他面向對象語言有區別。關於私有屬性和私有方法.有如下要點:
1.通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public)。
2.類內部可以訪問私有屬性(方法)
3.類外部不能直接訪問私有屬性(方法)
4.類外部可以通過”類名_私有屬性(方法)名" 訪問私有屬性(方法)
#測試私有屬性、私有方法
class Student:
def __init__(self,name,age):
self.name = name
self.__age = age #私有屬性
def __work(self): #私有方法
print("hardwork")
print("age:{0}".format(self.__age))
e = Student("張三",18)
print(e.name)
#print(e.age)
print(e._Student__age)
e._Student__work()
@property可以將一個方法的調用方式變成“屬性調用”。不用在寫方法名後面的(),下 面是一個簡單的示例:
#測試@property的用法
class Employee:
@property
def salary(self):
print("salary")
return 10000
emp1 = Employee()
#emp1.salary()
print(emp1.salary)
繼承可以讓子類具有父類的特性,提高了代碼的重用性。從設計上是一種增量進化,原有父類設計不變的情況下,可以增加新的功能,或者改進已有的算法。
Python支持多重繼承,一個子類可以繼承多個父類。繼承的語法格式如下:
class子類類名(父類 1[,父類2,.. ]):
類體
如果在類定義中沒有指定父類,則默認父類是object類。也就是說, object是所有類的父類,裡面定義了- -些所有類共有的默認實現,比如: _ new_ ().
定義子類時,必須在其構造函數中調用父類的構造函數。調用格式如下:
父類名_ jinit__ (self, 參數列表)
#測試繼承的基本使用
class Person:
def __init__(self,name,age):
self.name = name
self.__age = age #私有屬性
def say_age(self):
print("年齡18")
class Student(Person):
def __init__(self,name,age,score):
Person.__init__(self,name,age) #必須顯式調用父類的初始化方法,不然解釋器不會去調用
self.score = score
#Student-->Person-->object類
print(Student.mro())
s = Student("tony",18,100)
s.say_age()
print(s.name)
#print(s.age)
print(dir(s))
print(s._Person__age) #調用父類私有屬性
成員繼承:子類繼承了父類除構造方法之外的所有成員。
方法重寫:子類可以重新定義父類中的方法q這樣就會覆蓋父類的方法,也稱為“重寫”
#測試方法的重寫
class Person:
def __init__(self,name,age):
self.name = name
self.__age = age #私有屬性
def say_age(self):
print("我的年齡:",self.__age)
def say_introduce(self):
print("我的名字時{0}".format(self.name))
class Student(Person):
def __init__(self,name,age,score):
Person.__init__(self,name,age) #必須顯式調用父類的初始化方法,不然解釋器不會去調用
self.score = score
def say_introduce(self):
'''重寫父類方法'''
print("報告老師,我的名字是:{0}".format(self.name))
s =Student("tony",18,100)
s.say_age()
s.say_introduce()
dir()和mro()
內置函數dir() ,他可以讓我們方便的看到指定對象所有的屬性
通過類的方法mro(或者類的屬性_ mro_ 可以輸出這個類的繼承層次結構。
重寫__str__()方法
object有一-個_ _str_ ()方法 ,用於返回- -個對於“對象的描述”, 對應於內置函數str()經常用於print0方法,幫助我們查看對象的信息。- str_ ()可以重寫.
#測試重寫object的__str__()
class Person: #默認繼承object類
def __init__(self,name,):
self.name = name
def __str__(self):
return "my name is :{0}".format(self.name)
p = Person("tony")
print(p)
Python支持多重繼承,一個子類可以有多個“直接父類"。這樣,就具備了“多個父類”的特點。但是由於,這樣會被"類的整體層次"搞的異常復雜,盡量避免使用。
super()獲得父類的定義
在子類中,如果想要獲得父類的方法時,我們可以通過super()來做。super()代表父類的定義,不是父類對象。
多態是指同一一個方法調用由於對象不同會產生不同的行為。
多態( polymorphism )是指同一個方法調用由於對象不同可能會產生不同的行為。關於多態要注意以下2點:
1.多態是方法的多態,屬性沒有多態。
2.多態的存在有2個必要條件:繼承、方法重寫。
#多態
class Man:
def eat(self):
print("餓了吃飯")
class Chinese(Man):
def eat(self):
print("中國人用筷子吃飯")
class English(Man):
def eat(self):
print("英國人用叉子吃飯")
class Indian(Man):
def eat(self):
print("印度人用手吃飯")
def ManEat(m):
if isinstance(m,Man):
m.eat() #多態 一個方法調用,根據對象不同調用不同的方法
else:
print("不能吃飯")
ManEat(Chinese())