Python 基礎之面向對象初識與類的封裝

一.面向對象類的初識

1.類的定義

#三種方式:
#1.
class MyClass:
    pass

#2.推薦
class MyClass():
    pass

#3.
class MyClass(object):
    pass函數

總結爲一句話:class 類名能夠不加括號,能夠加括號,能夠加括號並且括號裏面加object。spa

2.類的實例化

class MyClass():
    pass
#類的實例化,實例化對象
obj = MyClass()        #obj 就是一個對象對象

3.類的基本結構

只有成員方法和成員屬性
對象.屬性  對象.方法()
#:
class MyClass():
    #成員屬性
    color = "綠色"
    #成員方法
    def pa(self):
        print("我小時候很喜歡爬樹")

obj = MyClass()
print(obj.color)
obj.pa()

'''
語法容許,大師必定不要這麼寫,class 和 def 不太同樣
函數在調用時,纔會觸發裏面的代碼塊
而類只要執行到這一行,就會觸發了
class MyClass():
    if 5 == 5:
        print(5555)
'''

#改造
class MyClass():
    def func(self):
        if 5 == 5:
            print(555)

obj = MyClass()
obj.func()
#類的命名:
在對類進行命名的時候,推薦使用大駝峯命名法
對於類的命名參考變量變量命名方式class

 

二.類的封裝性

公有的,在類能夠調用類的相關公有屬性
私有的(前面開頭加上__ 兩個下劃線),在外類不能夠調用類內的相關私有屬性方法
綁定方法:
    (1)綁定對象 (默認系統把對象當成參數傳遞)
    (2)綁定到類 (默認系統把類當成參數傳遞)
    這兩個參數,不管哪一種,都是系統本身傳遞的
    可是參數須要咱們本身定義好
#:
class Car():
    #公有屬性
    logo = "特拉斯"
    color = "綠色"
    #私有屬性
    __oil = '2.5L'

    #公有方法
    def run(self):
        print("個人小車跑的快")

    def jiao(self):
        print("個人%s 小車會滴滴的叫" % (self.logo))

    def jiao2(self):
        print("個人%s 小車會滴滴的叫,顏色 %s" % (self.logo,self.color))
     #私有方法
    def __oil_info(self):
        print("這就是個人私有方法")

#實例化對象
obj = Car()
print(obj)

#對象的相關操做import

1.實例化的對象訪問公有成員屬性和方法

對象.屬性
對象.方法()
#(1)調用公有成員屬性
print(obj.logo)
#print(obj.__oil) #私有的沒法在類外調用變量


#(2)調用公有成員方法
系統本身會默認的把obj這個對象當成參數進行傳遞
傳遞給run這個方法,self這個參數進行接收
obj.run()
obj.jiao()

#obj.__oil_info() #error 私有的不可以在進行調用lambda

2.實例化的對象動態添加公有成員屬性

obj.jiao2()  #輸出是綠色
obj.color = "黃色"
print(obj.color)
obj.jiao2()  #如今輸出是黃色

#查看obj 這個對象的內部成員,使用__dic__
print(obj.__dict__) #只有自定義的

類中的成員屬性和方法能夠給對象使用
可是隻有使用權,沒有歸屬權
類裏面的成員屬性和方法只對數類全部
對象只能使用(獲取) 不能修改或刪除
不歸對象全部object

3.實例化的對象動態添加公有成員方法

##(1) 添加無參方法
def func():
    print("個人汽車會變成,請叫我大黃蜂")

#把func方法複製給成員方法bianxing
obj.bianxing = func
obj.bianxing()
print(obj.__dict__)

##(2)添加有參方法

def qingtianzhu(name):
    print("請叫我"+name)

obj.qingtianzhu = qingtianzhu
obj.qingtianzhu("擎天柱")
print(obj.__dict__)

#改造一
obj.color = "藍色"
def qingtianzhu(self,name):
    print("請叫我"+name,"個人顏色是"+self.color)

obj.qingtianzhu = qingtianzhu
obj.qingtianzhu(obj,"擎天柱")

#改造2 把qintianzhu變成綁定 方法(系統幫助咱們傳遞對象)
import types
#MehtodType (函數,對象) 要把那個函數做爲對象的綁定方法
obj.qingtianzhu = types.MethodType(qingtianzhu,obj)
obj.qingtianzhu("擎天柱")

##(3)lambda 表達式
obj.fangxiangpan = lambda : print("我是方向盤的製做方法")
obj.fangxiangpan()語法

三.類的相關操做

#:方法

class MyCar():
    oil = "渦輪增壓發動機1.5T"
    __price = "100萬"

    #公有普通方法(只能類來調用)
    def oil_info():
        #類.oil
        print("個人油耗信息:"+MyCar.oil)

    #私有普通方法
    def __price_info():
        print("個人價格是保密")

#obj = MyCar()
#obj.oil_info() 對象調用不了

1.定義的類訪問公有成員屬性和方法

.成員屬性
.成員方法()
不管是私有屬性仍是方法都沒法在類外調用

print(MyCar.oil)
MyCar.oil_info()
#MyCar.__price_info() error 沒法使用類來調用私有成員

2.定義的類動態添加公有成員屬性和方法

#公有屬性
MyCar.logo = "中國一汽"
print(MyCar.logo)

#使用__dict__查看類內的成員
print(MyCar.__dict__)

#公有方法
##(1)無參方法
def dahuangfeng():
    print("請叫我大黃蜂")

MyCar.dahuangfeng = dahuangfeng
MyCar.dahuangfeng()

##(2)有參方法
def qingtianzhu(name):
    print("請叫我"+name)

MyCar.qingtianzhu = qingtianzhu
MyCar.qingtianzhu("一柱擎天")

##(3)lambda 表達式
MyCar.dog = lambda : print("個人車還會變成機器狗")
MyCar.dog()

 3.如何訪問私有成員

#:

class Plane():
    #公有屬性
    captain = "peter"
    #私有屬性
    __air_sister = "20個"
    #公有綁定方法
    def fly1(self):
        print("飛機會飛1")
    #公有普通方法
    def fly2():
        print("飛機會飛2")
    #私有的綁定方法
    def __oil_info1(self):
        print("飛機百千米油耗是10升1")
    #私有的普通方法
    def __oil_info2():
        print("飛機百千米油耗是10升2")
    #公有的綁定方法
    def pub_info1(self):
        print(self.__air_sister)
        self.__oil_info1()
        print(self.captain)
    #公有的普通方法
    def pub_info2():
        print(Plane.__air_sister)
        Plane.__oil_info2()

##(1)如何訪問類的私有成員?
利用公有方法調用類內的私有成員
私有成員在本類以內能夠隨便調用,在本類以外不能調用
#實例化對象 方法一
obj = Plane()
obj.pub_info1()
#也可使用類來調用  方法二
Plane.pub_info2()

##(2)若是就想直接在類外調用私有成員,有方法嗎
私有成員的更名策略:
_類名+私有成員 (沒有真正的私有化,類外能夠經過更名策略仍然調取)

print("========")
print(obj._Plane__air_sister)
Plane._Plane__oil_info2()

##(3)如何刪除成員
# (1) 實例化的對象刪除公有成員屬性和方法
obj = Plane()
print(obj.__dict__)
print(obj.captain)

captain 成員屬性歸屬於class Plane,不是obj
obj 能夠有使用權,沒有全部權(不可以修改或者刪除類內的屬性)
若是對象有該屬性方法,先優先調用該對象裏面的成員
若是都沒有.直接報錯
#刪除對象屬性
obj.captain = "JIAN"
print(obj.__dict__)
print(obj.captain)

del obj.captain
print(obj.captain) #obj本身的captain 被刪除了
#obj.pub_info1() 裏面的peter還在

#刪除對象的方法
print("==========")
obj.fly222 = lambda : print("個人飛機能潛水")
obj.fly222()
print(obj.__dict__)
# del obj.fly
# print(obj.__dict__)

##(2)定義的類刪除公有成員屬性和方法
對象能夠調用類中的公有成員和方法
類不能調用對象的相關成員屬性和方法
方向不可逆
一個類能夠產生多個對象,多個對象彼此之間,相互獨立

#刪除類的成員屬性
# del Plane.captain
# print(Plane.captain)
# print(obj.captain)
# Plane.fly111222() error  類不能調用對象的方法

# 刪除類的成員方法del Plane.pub_info1# Plane.pub_info1() error  不存在

相關文章
相關標籤/搜索