Python是一門現代化的程式語言,也是一門物件導向的程式語言。
現代程式語言幾乎都支援物件導向程式設計,物件導向程式設計是最有效的軟體編寫方法之一。你可以用類和物件來表示現實當中的任何的事物和行為。
編寫類時,你會定義某一類東西通用的特徵和行為。然後通過類建立物件,每個物件都自動具備這個類的特徵和行為,還可以賦予每個物件獨特的個性。
通過這種方式,你幾乎可以把看到的任何事物用程式碼來表示。 比如我們來描述一下「我開車去上班,車到半路沒油了,於是我先加油」 這個普通的場景。
在這個場景中,涉及到的人和物,有 「我」, "車", 「油」, 這些人和物就可以通過物件來表示。 我是一個人,屬於人這個類, 我的車屬於 車這個類, 油就是屬於油這個類。
還有動作和行為, 開車屬於我的動作,加油也是屬於我的動作。
出了動作和行為外,還有屬性和狀態,比如車沒油, 加完油以後,有油了。
類和物件的語法稍微有點複雜,要理解確實有一點難度,這也是大多數學習程式設計的人最後選擇了放棄。 但其實只要學會把生活的當中的範例抽象出來,類和物件沒有想的那麼難。
類是具備共同特徵和共同行為的事物的統稱。 所謂人以群分,物以類聚。
類的表示通常採用駝峰式命名。
class Car:
pass
class Mobile:
pass
物件(Object)是一類事物中的一個成員(個體), object 的中文是東西,物件又被稱為範例,是一個實實在在存在的東西。
通過類得到物件,這個過程叫範例化,類似函數的呼叫。
my_car = Car()
your_car = Car()
類就相當於建造房子時的施工圖紙(blueprint),是一個模板,是負責建立房子(物件)的,通過類可以得到物件。 就好像玩植物大戰殭屍的遊戲,上方的卡片就相當於類, 拖動卡片就可以在下方的空地上得到一個物件。
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.name
self 表示在類裡面物件本身。
類外面定義一個變數。
self 可以換成其他的變數名,但是是規範,強烈不建議更換。
class Mobile:
def __init__(self, brand):
self.brand = brand
print(self)
redmi = Mobile("redmi")
print(redmi)
類變數和類屬性一樣。
範例變數可以存取類變數,
類變數不能能存取範例變數
實體方法是用得最多的方法型別,一般預設情況下就是實體方法,通過範例呼叫。
# 初始化方法
# 實體方法的定義
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)
繼承充分發揮了物件導向的優勢,編寫類時,並非總是要從空白開始。如果要編寫的類是另一個現成類的特殊版本,可使用繼承 。一個類繼承另一個類時,將自動獲得另一個類的所有屬性和方法。原有的類稱為父類別 ,而新類稱為子類 。子類繼承了父類別的所有屬性和方法,同時還可以定義自己的屬性和方法。
在寫程式碼時,我們可以利用別人已經寫好的類,我們自己定義一個類繼承別人寫的類,就不需要從零開始寫了,大大提高了程式碼的編寫速度。
重寫父類別方法
如果子類想實現自己的方法,不想用父類別現成的,就可以重寫父類別方法。
class Mobile:
def __init__(self, brand):
self.brand = brand
print(self)
def call():
print("calling")
class Iphone(Mobile):
def call():
print("Iphone Calling")
如果你的重寫了父類別裡面的一個方法,然後又想呼叫父類別裡面的一些方法,可以用超繼承,我們在單元測試裡面會看到這個操作。不用去重寫複製程式碼,輕輕鬆鬆可以做到更多繼承。(瞭解會用即可)-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()
作者:九柄
工作:軟體測試工程師
領資料或者技術交流務必備註部落格園
歡迎點贊和三連。