1. 程式人生 > >18.python面對物件程式設計(一)—什麼是面向物件,類和例項,訪問限制

18.python面對物件程式設計(一)—什麼是面向物件,類和例項,訪問限制

終於開始了python的核心內容了,前面都是細枝末節的小東西。先開始第一個話題,什麼是面向物件的程式設計(opp)。

1)什麼是面向物件

我們可以拿C語言這個典型的面向過程的程式語言來對比,面對同樣一個問題,”我吃飯“(原諒我是個吃貨)。面向過程關注的是吃這個動作。而面向物件關注的是我或者飯這兩個物件,而吃只是其中的一個方法。為什麼這裡用的是“或”呢?因為物件只能關注一個,不能三心二意。要不就關注”我“,要不就關注“飯”。因而,面向物件抽象度更高,因為他包含了兩類事物,一類是資料,一類是動作。

2)類和物件

對於面向物件程式設計來說,我們固然關注物件,但是物件太多了。自然界中的任意一樣東西都是物件。我們把各種物件中的某一屬性剝離出來,讓他們成為一類或者說是一個大的集合。這就叫做類(class),也是一種抽象的資料型別。比如說:動物(animal)。動物是個抽象的概念,我們在其中定義一個具體的動物,狼(wolf)。這就是例項(instance)

。定義一個類的標準格式如下:

class Animal(object):
    def __init__(self,legs,eyes):
        self.legs=legs
        self.eyes=eyes

Animal是類名,一般首字母大寫。後面括號表示的是這個類從哪個類繼承下來的。下一行的__init__(是兩個下劃線)表示的是這是一個特殊的變數,就是特殊的方法。這個方法是把物件(例項)的屬性繫結到這個物件(例項)上面。self是一個形式引數,表示的是這個物件(例項)本身。後面的兩個是對這個類的預設屬性。下面的兩句,則是將該物件的屬性繫結到物件上面。然後是指定一個例項。

wolf=Animal(4,2)
print(wolf.eyes)

這裡對wolf賦給屬性。

3)訪問限制

我們曾經講過,函式和變數的作用域。很明顯,我們剛剛定義的類,是public的,很容易被修改。示例如下:

wolf=Animal(4,2)
print(wolf.eyes)
wolf.eyes=3
print(wolf.eyes)

輸出:

2
3

你可以想一下,我們的一個物件如果這樣被外部隨意修改的話是很可怕的。因為不知道會有生命意想不到的事情發生。如果我們想保證物件的安全,不被隨便修改,該怎麼辦呢?

我們可以採用_XXX型別資料來定義屬性。示例如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Animal(object):
    def __init__(self,legs,eyes):#這三個都是形參
        self.__legs=legs
        self.__eyes=eyes

我們嘗試從外面訪問:

wolf=Animal(4,2)
print(wolf.__eyes)

輸出:

Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/exercise/exercise.py", line 8, in <module>
    print(wolf.__eyes)
AttributeError: 'Animal' object has no attribute 'eyes'

已經不能訪問了。

我們思考一下,既然它提示的錯誤是這個物件沒有eyes這個屬性,是不是我們指定類就可以訪問了?

說幹就幹!我們把程式碼改成如下格式:

wolf=Animal(4,2)
print(wolf._Animal__eyes)

果然成功了!!但是千萬不要隨便這麼幹!因為不同的直譯器會將__eyes改成不同的變數名。

那我們又想要訪問怎麼辦呢?因為,我們是擔心別的程式會誤操作修改物件,但是如果我們確實有需要修改物件怎麼辦?這就涉及到面對物件的特性了。下回再說了。

希望有志同道合的小夥伴關注我的公眾平臺,歡迎您的批評指正。