Python自學教學12-類和物件怎麼用

2022-08-30 18:02:36

Python是一門現代化的程式語言,也是一門物件導向的程式語言。

現代程式語言幾乎都支援物件導向程式設計,物件導向程式設計是最有效的軟體編寫方法之一。你可以用類和物件來表示現實當中的任何的事物和行為。

編寫類時,你會定義某一類東西通用的特徵和行為。然後通過類建立物件,每個物件都自動具備這個類的特徵和行為,還可以賦予每個物件獨特的個性。

通過這種方式,你幾乎可以把看到的任何事物用程式碼來表示。 比如我們來描述一下「我開車去上班,車到半路沒油了,於是我先加油」 這個普通的場景。

在這個場景中,涉及到的人和物,有 「我」, "車", 「油」, 這些人和物就可以通過物件來表示。 我是一個人,屬於人這個類, 我的車屬於 車這個類, 油就是屬於油這個類。

還有動作和行為, 開車屬於我的動作,加油也是屬於我的動作。

出了動作和行為外,還有屬性和狀態,比如車沒油, 加完油以後,有油了。

類和物件的語法稍微有點複雜,要理解確實有一點難度,這也是大多數學習程式設計的人最後選擇了放棄。 但其實只要學會把生活的當中的範例抽象出來,類和物件沒有想的那麼難。

什麼是類

類是具備共同特徵和共同行為的事物的統稱。 所謂人以群分,物以類聚。

類的表示通常採用駝峰式命名。

class Car:
 pass

class Mobile:
 pass

什麼是物件

物件(Object)是一類事物中的一個成員(個體), object 的中文是東西,物件又被稱為範例,是一個實實在在存在的東西。

  • 我的車
  • 你的車
  • 隔壁鄰居的車

通過類得到物件,這個過程叫範例化,類似函數的呼叫。

my_car = Car()
your_car = Car()

類和物件的關係

類就相當於建造房子時的施工圖紙(blueprint),是一個模板,是負責建立房子(物件)的,通過類可以得到物件。 就好像玩植物大戰殭屍的遊戲,上方的卡片就相當於類, 拖動卡片就可以在下方的空地上得到一個物件。

https://s3.ap-northeast-1.wasabisys.com/img.tw511.com/202208/faviconjj5uyede4xo.ico
https://gitee.com/looker53/pics/raw/master/img//20210605153158.png
my_car = Car()
car_class = Car
print(type(my_car), type(car_class))

屬性

整個類的特徵,所有成員都一致,又被稱為類變數。

class Car:
    wheel = True
    material = ["塑料""鐵""鋁合金""橡膠"]

獲取類屬性

print(Car.wheel)

範例獲取類屬性

Car().wheel

修改類屬性

Car.wheel = False

__init__ 初始化方法

*__init__* 叫初始化方法,代表一個物件產生時的初始化過程。 比如一部手機生產出來後,需要貼 logo,設計型號,桌布,螢幕亮度。

class Mobile:
    def __init__(self, brand, model, brightness):
        self.brand = brand
        self.model = model
        self.brightness = brightness
        print("Mobile 的品牌:{},型號:{},亮度:{}".format(brand, model, brightness))

這個初始化方法有點特殊,在範例化一個物件時,會自動呼叫這個方法。 方法的第一個引數是 self, 它是一個固定的語法,表示物件本身,其他的 brand, model, brightness 這些引數和普通的函數引數一樣,改傳值的時候傳入實際引數就可以。

self.brand 這樣的語法表示定義範例屬性,當傳入一個具體的引數時,就能賦值成為一個物件的屬性。

初始化方法不能有返回值。

self

  • self, 我自己,這個。這個人的名字 self.name

  • self 表示在類裡面物件本身。

  • 類外面定義一個變數。

  • self 可以換成其他的變數名,但是是規範,強烈不建議更換。

    class Mobile:
        def __init__(self, brand):
            self.brand = brand
            print(self)

    redmi = Mobile("redmi")
    print(redmi)

    類變數和範例變數

  • 類變數和類屬性一樣。

  • 範例變數可以存取類變數,

  • 類變數不能能存取範例變數

方法(Method)

實體方法是用得最多的方法型別,一般預設情況下就是實體方法,通過範例呼叫。

# 初始化方法

# 實體方法的定義
def drive(self):
    print('{} 正在開車'.format(self.name))

類方法是通過類呼叫的方法,可以用來作為備用的建構函式,初始化一個類。

class Dog:

    def __init__(self, fullname):
     self.fullname = fullname

    @classmethod
    def gouzao(cls, name1, name2):
     return cls(name1 + name2)

a = Dog('yuze')
print(a)

b  = Dog.gouzao('yuze','wang')
print(b)

繼承

https://s3.ap-northeast-1.wasabisys.com/img.tw511.com/202208/faviconii54ho5ehtg.ico
https://gitee.com/looker53/pics/raw/master/img//20210605153215.png

繼承充分發揮了物件導向的優勢,編寫類時,並非總是要從空白開始。如果要編寫的類是另一個現成類的特殊版本,可使用繼承 。一個類繼承另一個類時,將自動獲得另一個類的所有屬性和方法。原有的類稱為父類別 ,而新類稱為子類 。子類繼承了父類別的所有屬性和方法,同時還可以定義自己的屬性和方法。

在寫程式碼時,我們可以利用別人已經寫好的類,我們自己定義一個類繼承別人寫的類,就不需要從零開始寫了,大大提高了程式碼的編寫速度。

重寫父類別方法

如果子類想實現自己的方法,不想用父類別現成的,就可以重寫父類別方法。

class Mobile:
    def __init__(self, brand):
        self.brand = brand
        print(self)
    
    def call():
        print("calling")
        
class Iphone(Mobile):
    def call():
        print("Iphone Calling")

Super

如果你的重寫了父類別裡面的一個方法,然後又想呼叫父類別裡面的一些方法,可以用超繼承,我們在單元測試裡面會看到這個操作。不用去重寫複製程式碼,輕輕鬆鬆可以做到更多繼承。(瞭解會用即可)-super(子類名,self),根據子類找到父類別。

class Animal:
    def run(self):
        print("我是一隻動物,我在跑")

class Dog(Animal):
    def run(self):
        super().run()
        print("狗在跑")

Dog().run()

正常的繼承:

class Animal:

    def __init__(self, type):
        self.type = type

    def run(self):
        print("{} am running".format(self.type))
        

class Dog(Animal):
    def __init__(self):
        Animal.__init__(self, 'Dog')
        
a_dog = Dog()
a_dog.run()