python第五次筆記---物件導向

崔國祥發表於2020-11-25

一、物件導向是什麼?

一種程式設計思想,是針對大型程式,複雜邏輯開發時使用的程式設計思想。
是一種設計者思維。

抽象:把看著像的東西,統稱為一類。
封裝:將屬性(變數)和方法(函式)定義列表中,可以隱藏部分或全部資料
繼承:讓子類繼承父類的所有公有的屬性和方法。
多型:讓同一個方法在不同類中實現不同功能。

二、物件導向

類(Class): 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類的例項。
方法:類中定義的函式。
類變數:類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。
資料成員:類變數或者例項變數用於處理類及其例項物件的相關的資料。
方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
區域性變數:定義在方法中的變數,只作用於當前例項的類。
例項變數:在類的宣告中,屬性是用變數來表示的,這種變數就稱為例項變數,例項變數就是一個用 self 修飾的變數。
繼承:即一個派生類(derived class)繼承基類(base class)的欄位和方法。繼承也允許把一個派生類的物件作為一個基類物件對待。例如,有這樣一個設計:一個Dog型別的物件派生自Animal類,這是模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。
例項化:建立一個類的例項,類的具體物件。
物件:通過類定義的資料結構例項。物件包括兩個資料成員(類變數和例項變數)和方法。

三.類

1、 類是一種抽象資料型別,是對現實世界的一類資料及其操作的封裝;用於建立物件的模板(屬性(資料)和 方法(函式))

物件:型別(創造物件的類名)value、id , 一切皆為物件

屬性:物件擁有的value
方法:方法是封裝在類中的函式,公開方法可以被類的物件呼叫。

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

類例項化後,可以使用其屬性,實際上,建立一個類之後,可以通過類名訪問其屬性。

2、類的例項化

import Person

bauer = Person("Bauer")
bauer.hello()

3、類成員的可見性

import uuid

class Person(object):
  nationality = "China"
  def__init__(self,name):
    self.name = name
    self.__id = str(uuid.uuid1())
  def hello(self):
    print("Hello,I am%s,I come from %s,My ID is %s"%(sef.name,self.nationality,sef.__id))
if__name__ == "__main__":
  bauer = Person("Bauer")
  print(bauer.__dict__)
  print(bauer._Person__id)


# 輸出 {'name':'Bauer','_Person__id':'ed496846-94c7-11e9-80c4-5ce0c5e8bcf0'}
# ed496846-94c7-11e9-80c4-5ce0c5e8bcf0

4、私有屬性

私有屬性和例項屬性必須在__init__方法中進行宣告,但私有屬性的屬性名需要以雙下劃線__開頭,比如Person中的__id屬性。私有屬性是一種特殊的例項屬性,只允許在例項物件的內部(成員方法或私有方法中)訪問,而不允許在例項物件的外部通過例項物件或類來直接訪問,也不能被子類繼承。

import uuid

class Person(object):
    nationality = "China"
 
    def __init__(self, name):
        self.name = name
        self.__id = str(uuid.uuid1())
 
    def hello(self):
        print("Hello, I am %s, I come from %s, My ID is %s" %(self.name, self.nationality, self.__id))
 
if __name__ == "__main__":
    bauer = Person("Bauer")
    bauer.hello()
    # print(bauer.__id) # AttributeError: 'Person' object has no attribute '__id'
    # print(Person.__id) # AttributeError: type object 'Person' has no attribute '__id'
# 輸出 Hello, I am Bauer, I come from China, My ID is c0c02dcc-94aa-11e9-972c-5ce0c5e8bcf0

私有屬性不能通過類直接訪問,也不能通過例項物件直接訪問,但私有屬性可以通過成員方法進行訪問。
私有屬性可以通過成員方法或是例項物件._類名__私有變數名的方式來訪問。

import uuid
class Person(object):
    nationality = "China"
 
    def __init__(self, name):
        self.name = name
        self.__id = str(uuid.uuid1())
 
    def hello(self):
        print("Hello, I am %s, I come from %s, My ID is %s" %(self.name, self.nationality, self.__id))
 
    def get_id(self):
        return self.__id
 
if __name__ == "__main__":
    bauer = Person("Bauer")
    bauer.hello()
    print(bauer._Person__id)
    print(bauer.get_id())
"""
輸出 Hello, I am Bauer, I come from China, My ID is c0c02dcc-94aa-11e9-972c-5ce0c5e8bcf0
354547ae-94ab-11e9-a52c-5ce0c5e8bcf0
354547ae-94ab-11e9-a52c-5ce0c5e8bcf0
"""

5、繼承

Python 同樣支援類的繼承,如果一種語言不支援繼承,類就沒有什麼意義。

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>

BaseClassName(示例中的基類名)必須與派生類定義在一個作用域內。除了類,還可以用表示式,基類定義在另一個模組中時這一點非常有用:

class DerivedClassName(modname.BaseClassName):

6、類屬性與方法

類的私有屬性
__private_attrs:兩個下劃線開頭,宣告該屬性為私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs。

類的方法
在類的內部,使用 def 關鍵字來定義一個方法,與一般函式定義不同,類方法必須包含引數 self,且為第一個引數,self 代表的是類的例項。

self 的名字並不是規定死的,也可以使用 this,但是最好還是按照約定是用 self。

類的私有方法
__private_method:兩個下劃線開頭,宣告該方法為私有方法,只能在類的內部呼叫 ,不能在類的外部呼叫。self.__private_methods。

相關文章