1. 程式人生 > >python_面向對象筆記

python_面向對象筆記

間接 派生類 內部 重復 class a 抽象 類的使用 輸入 self.

繼承

什麽是繼承?
繼承是一種新建類的方式,新建的類稱為子類或派生類
父類又稱為基類、超類

子類可以“遺傳”父類的屬性,從而可以減少代碼冗余

如何尋找繼承關系?
先抽象,再繼承,繼承描述的就是
一種父子關系 / 從屬關系

繼承的語法

class Foo1:
pass

class Foo2:
pass

class Bar(Foo1, Foo2):
pass

class Bar: # 在python3中沒有繼承任何類的類,默認繼承object
pass

新式類與經典類

新式類與經典類:

新式類:繼承object類的子類,以及該子類的子類。。。
在python3中全都是新式類

經典類:沒有繼承object的子類,以及該子類的子類。。。
只有在python2中才有經典類,在python2中沒有繼承任何類的子類不會
默認繼承object類
class Foo(object):
pass


經典類與新式類的區別:在菱形繼承上
經典類:深度優先查找
新式類:廣度優先查找
Foo.mro()

在子類定義的方法中重用父類的功能:
方式一:與繼承無關
指定道姓地調用某一個類的函數:
類名.函數名(對象,參數1,參數2,...)

方式二:嚴格依賴繼承
super(自己的類名,self).綁定方法(參數1,參數2,。。。)

如何查找繼承關系

先抽象
    抽象對象之間相似之處得到了類
    再總結類與類之間的相似得到父類
再繼承
    子類繼承父類,子類可以遺傳父類的屬性

屬性查找

obj.x
1、先從obj.__dict__
2、對象的類.__dict__
3、父類.__dict__
..........

派生

子類定義的名字會覆蓋父類的同名屬性
class Parent:
    x = 1

    def f1(self):
        
print(from parent) class Sub(Parent): z = 3 def f1(self): # Parent.f1(self) super(Sub, self).f1() # super會檢索Sub.mro() print(from sub)

組合

作用:
    組合與繼承的作用一樣,都是用來減少類與類之間的重復代碼

定義:
    A類的對象具備某一個屬性,該屬性的值是B類的對象
    基於這種方式就把A類與B類組合到一起
    對象既能使用A類中的數據與功能,也能使用B類中的數據與功能

封裝


什麽是封裝?

封裝(從字面意思理解)就是隱藏,隱藏指的是在類內部將一個屬性藏起來
讓類外部的使用者無法直接用到。在py中就是用__開頭將一個屬性藏起來.

補充說明:封裝絕對不是單純意義的隱藏
需知定義屬性的目的就是為了讓使用者去用,使用者要想使用類內部隱藏的屬性
需要類的設計者在類內部開一個接口(定義一個方法),在該方法內訪問隱藏的屬性
,使用者以後就通過該方法來“間接地”訪問內部隱藏的屬性
作為類的設計者可以在接口之上附加任意邏輯從而嚴格控制類的使用者對屬性的操作


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

def tell_name(self):
# 添加邏輯
return self.__name


obj = People(‘egon‘)
# obj.__name
obj.tell_name()

封裝函數屬性: 隔離復雜度


class ATM:
def __card(self):
print(‘插卡‘)

def __auth(self):
print(‘用戶認證‘)

def __input(self):
print(‘輸入取款金額‘)

def __print_bill(self):
print(‘打印賬單‘)

def __take_money(self):
print(‘取款‘)

def withdraw(self):
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money()

python_面向對象筆記