Python面對對象編程

2018年7月3日筆記

1.Python編程方式

面向過程:根據(jù)業(yè)務(wù)邏輯從上到下寫代碼
函數(shù)式:將某功能代碼封裝到函數(shù)中,日后便無需重復(fù)填寫,僅調(diào)用函數(shù)即可
面對對象:對函數(shù)進行分類和封裝,讓開發(fā)"更好更快更強"。

2.面對對象概念

面對對象就不像面對過程那樣按照功能劃分模塊了,它所關(guān)注的是軟件系統(tǒng)有哪些參與者,把這些參與者稱為對象,找出這些軟件系統(tǒng)的參與者也就是對象之后,分析這些對象有哪些特征、哪些行為,以及對象之間的關(guān)系。所以說面對對象的開發(fā)核心是對象。

3.Python類與對象

3.1 什么是類
面對對象編程的2個非常重要的概念:類和對象
概念:類是用來描述具有相同的屬性和方法的對象的集合,它定義了該集合中每個對象所共有的屬性和方法,對象是類的實現(xiàn)。

3.2 什么是對象
萬物皆對象,對象擁有自己的行為和特征。

3.3 類和對象的關(guān)系
類是對象的類型,對象是類的實例。類是抽象的概念,對象是一個你能夠摸得著,夠得到的實體。二者相輔相成,誰也離不開誰。

4. 類的聲明和實例化

4.1 創(chuàng)建類
使用class語句來創(chuàng)建一個類,class之后為類的名稱并以冒號結(jié)尾:

class ClassName:
    "類的幫助信息"
    class_suite

以上的ClassName由類成員、方法、數(shù)據(jù)屬性組成。

示例:

class MyClass:
    "創(chuàng)建第一個類"
    name = "python"
    def funcA(self):
        return "Development"

4.2 實例化類
實例化類其他編程語言中一般用關(guān)鍵字new,但是在Python中沒有這個關(guān)鍵字,類的實例化類似函數(shù)調(diào)用方式。
示例:

x = MyClass()

4.3 如何調(diào)用類的方法
可以使用點(.)來訪問對象的屬性。

class MyClass:
    "創(chuàng)建第一個類"
    name = "python"
    def funcA(self):
        return "Development"
        
#實例化類
a = MyCLass()
#用.的方法訪問類的屬性和方法
print(a.name) #訪問屬性
print(a.funcA()) #訪問方法

4.4 構(gòu)造函數(shù)

__init__()是一個特殊的方法屬于類的專有方法,被稱為類的構(gòu)造函數(shù)或初始化方法,
方法的前面和后面都有兩個下劃線。這是為了避免Python默認方法和普通方法發(fā)生名稱的沖突。
每當創(chuàng)建類的實例化對象的時候,__init__()方法會被默認被運行。
作用就是初始化已實例化的對象。
class MyClass:
    def __init__(self,name,age):
        self.name = name
        self.age = age
x = MyClass('xiaoming',20)
print(x.name,x.age)

上面一段代碼的運行結(jié)果如下:

xiaoming 20

4.5 self
self代表類的實例,self在定義類的方法是必須的,雖然在調(diào)用時不必傳入相應(yīng)的參數(shù)。
類的方法和普通的函數(shù)只有一個特別的區(qū)別,他們必須有額外的第一個參數(shù)名稱,按照慣例它的名字是self。self并不是python的關(guān)鍵字,你完全可以用其他單詞取代他,只是按照慣例和標準的規(guī)定,推薦使用self。
示例:self.class則指向類。

class Test:
    def printClass(self):
        print(self)
        print(self.__class__)

x = Test()
x.printClass()

上面一段代碼運行結(jié)果如下:

<__main__.Test object at 0x000001F21142C198>
<class '__main__.Test'>

小節(jié):
(1)類就是一個模板,模板里可以包含多個參數(shù),函數(shù)里可以實現(xiàn)一些功能
(2)對象則是根據(jù)模板創(chuàng)建的示例,通過實例對象可以執(zhí)行類中的對象

5.類的屬性和方法

5.1 操作類的屬性
常見針對類的屬性的一些方法:
1.可以使用實例化對象名+.來訪問對象的屬性
2.getattr(obj,name[,default]):
3.hasattr(obj,name)
4.setattr(obj,name,value)
注意:name需要加單引號,obj為實例化對象名稱
示例:

class Test:
    a = 1
x = Test()
print(getattr(x,'a'))

上面一段代碼的運行結(jié)果如下:

1

示例2

class People:
    def __init__(self,name,age,weight):
        self.name = name
        self.age = age
        self.__weight = weight

    def speak(self):
        print("%s 說:我今年 %d 歲" %(self.name,self.age))

x = People('小明',10,50)
x.speak()

上面一段代碼的運行結(jié)果如下:

小明 說:我今年 10 歲

5.2 內(nèi)置類屬性


圖片.png-9.7kB
圖片.png-9.7kB

5.3 類的私有類型和私有方法
5.3.1 類的私有屬性

__private_attrs:兩個下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接訪問。在類內(nèi)部的方法中使用self.__private_attrs。

5.3.2 類的方法
在類的內(nèi)部,使用def的關(guān)鍵字可以為類定義為一個方法,與一般函數(shù)定義不同,類方法必須包含參數(shù)self,且第一個為參數(shù)
3.3.3 類的私有方法

__private_method:兩個下劃線開頭,聲明該方法為私有方法,不能在類的外部調(diào)用。在類的內(nèi)部調(diào)用self.__private_methods

練習(xí)

1.定義車類和人類

class People:
    def __init__(self,name,age,car):
        self.name = name
        self.age = age
        self.car = car

    def play(self):
        print("車來了,注意安全")

class Car:
    def __init__(self,brand,color,price):
        self.brand = brand
        self.color = color
        self.price = price

    def run(self):
        print("{}{}的汽車在飛馳,該車的價格為{}萬".format(self.brand,self.color,self.price))

2.定義一個學(xué)生類

class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age

    def get_course(self):
        return max(self.score)

s = Student('小明',20,[68,80,99])
print(s.get_name())
print(s.get_age())
print(s.get_course())

6.Python類的繼承

類繼承的概念:面對對象編程的主要好處之一是代碼的重用,實現(xiàn)這種重用的方法之一是通過繼承的機制。繼承可以完全理解為類之間的類型和子類型關(guān)系。在現(xiàn)實生活中,繼承一般指的是子女繼承父輩的財產(chǎn)。那么在程序中,繼承描述的是事物之間的所屬關(guān)系,例如貓和狗都屬于動物,程序中可以描述為貓和狗都繼承自動物。
子類繼承父類示例:

class Animal():
    def __init__(self,name,sex):
        self.name = name
        self.sex = sex
    def eat(self):
        print("%s是一只%s,喜歡吃點心"%(self.name,self.sex))

class Dog(Animal):
    pass

class Cat(Animal):
    pass

dog = Dog("小黑","公狗")
dog.eat()
cat = Cat("小白","母貓")
cat.eat()

上面一段代碼的運行結(jié)果如下:

小黑是一只公狗,喜歡吃點心
小白是一只母貓,喜歡吃點心

重寫方法

class Animal():
    def __init__(self,name,sex):
        self.name = name
        self.sex = sex
    def eat(self):
        print("%s是一只%s,喜歡吃點心"%(self.name,self.sex))

class Dog(Animal):
    def __init__(self,name,sex):
        super().__init__(name,sex)

class Cat(Animal):
    def __init__(self,name,sex):
        super().__init__(name,sex)

dog = Dog("小黑","公狗")
dog.eat()
cat = Cat("小白","母貓")
cat.eat()

小結(jié)

繼承中的一些特點:
1.python總是首先查找對應(yīng)類型的方法,如果它不能在派生類中找到對應(yīng)的方法,他才開始到基類中逐個查找。

7.Python面對對象特性

面對對象的三大特性:封裝、繼承、多態(tài)

作業(yè)

1.面條是食物的一種。編寫一個名為Food的父類,一個名為noodle的子類。在子類中添加一個名為taste的屬性,用于存儲面條口味的列表,并編寫一個顯示所有口味的方法show_taste()。創(chuàng)建一個f實例,并調(diào)用這個方法。

class Food():
    def __init__(self, name, type):
        self.name = name
        self.type = type

class noodle(Food):
    def __init__(self,name,type):
        super().__init__(name,type)
        self.taste = ['酸','甜','苦','辣']
    def show_taste(self):
        print(self.taste)

f = noodle('牛肉面','面類')
f.show_taste()

2.定義一個撲克類,屬性是顏色,數(shù)字。
定義一個手類,屬性是撲克牌的顏色數(shù)字。
定義一個人類,屬性是左手右手。類里定義一些方法,比如交換,展示。

class Poker():
    def __init__(self,color,number):
        self.color = color
        self.number = number
    def show(self):
        print("{}-{}".format(self.color,self.number))

class Hand():
    def __init__(self,poker):
        self.poker = poker

class People():a
    def __init__(self,left,right):
        self.left = left
        self.right = right
    def exchange(self):
        self.left,self.right=self.right,self.left
    def display(self):
        self.left.poker.show()
        self.right.poker.show()

p1 = Poker('梅花','K')
p2 = Poker('紅桃','A')
left = Hand(p1)
right = Hand(p2)
p = People(left,right)
p.display()
p.exchange()
p.display()

上面一段代碼的運行結(jié)果如下:

梅花-K
紅桃-A
紅桃-A
梅花-K

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容