現代程式設計語言幾乎都支援面向對象程式設計,面向對象程式設計是最有效的軟體編寫方法之一。你可以用類和對象來表示現實當中的任何的事物和行為。
編寫類時,你會定義某一類東西通用的特征和行為。然後通過類建立對象,每個對象都自動具備這個類的特征和行為,還可以賦予每個對象獨特的個性。
通過這種方式,你幾乎可以把看到的任何事物用代碼來表示。 比如我們來描述一下“我開車去上班,車到半路沒油了,于是我先加油” 這個普通的場景。
在這個場景中,涉及到的人和物,有 “我”, "車", “油”, 這些人和物就可以通過對象來表示。 我是一個人,屬于人這個類, 我的車屬于 車這個類, 油就是屬于油這個類。
還有動作和行為, 開車屬于我的動作,加油也是屬于我的動作。
出了動作和行為外,還有屬性和狀态,比如車沒油, 加完油以後,有油了。
類和對象的文法稍微有點複雜,要了解确實有一點難度,這也是大多數學習程式設計的人最後選擇了放棄。 但其實隻要學會把生活的當中的示例抽象出來,類和對象沒有想的那麼難。
什麼是類
類是具備共同特征和共同行為的事物的統稱。 所謂人以群分,物以類聚。
類的表示通常采用駝峰式命名。
class Car:
pass
class Mobile:
pass
什麼是對象
對象(Object)是一類事物中的一個成員(個體), object 的中文是東西,對象又被稱為執行個體,是一個實實在在存在的東西。
- 我的車
- 你的車
- 隔壁鄰居的車
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SN5ATO1IzYmRjM0AzM2ITMzYzXwQTOwQDMzAzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
通過類得到對象,這個過程叫執行個體化,類似函數的調用。
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__
*
__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)
繼承
繼承充分發揮了面向對象的優勢,編寫類時,并非總是要從空白開始。如果要編寫的類是另一個現成類的特殊版本,可使用繼承 。一個類繼承另一個類時,将自動獲得另一個類的所有屬性和方法。原有的類稱為父類 ,而新類稱為子類 。子類繼承了父類的所有屬性和方法,同時還可以定義自己的屬性和方法。
在寫代碼時,我們可以利用别人已經寫好的類,我們自己定義一個類繼承别人寫的類,就不需要從零開始寫了,大大提高了代碼的編寫速度。
重寫父類方法
class Mobile:
def __init__(self, brand):
self.brand = brand
print(self)
def call():
print("calling")
class Iphone(Mobile):
def call():
print("Iphone Calling")
Super
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()