Python學習三天計劃-3

面向對象

一、類的定義

1.類定義

image-20221022233610387

  • class是關鍵字,表示要定義類了
  • 類的屬性,即定義在類中的變數(成員變數)
  • 類的行為,即定義在類中的函數(成員方法)

2.對象

創建類對象的語法:

image-20221022233642893

class Stu:
	name = None
    age = None
    
student = Stu()

3.變數、方法

class Stu:
	name = None
    age = None
    
    # 注意:在類的方法參數中,要加入self參數,相當於java的this關鍵字(表示類對象本身)
    def say(self):
        print("hello")

self關鍵字

self關鍵字是成員方法定義的時候,必須填寫的。

  • 它用來表示類對象自身的意思
  • 當我們使用類對象調用方法的是,self會自動被python傳入
  • 在方法內部,想要訪問類的成員變數,必須使用self

注意:

傳參時可以忽略

class Stu:
    name = None
    age = None

    # 注意:在類的方法參數中,要加入self參數,相當於java的this關鍵字(表示類對象本身)
    def say(self):
        print("hello")


student = Stu()
# 調用say方法時,不需要傳入參數
student.say()

image-20221022234335932

二、類的屬性和行為

image-20221022234436528

現實世界的事物也有屬性和行為,類也有屬性和行為。

使用程式中的類,可以完美的描述現實世界的事物

為什麼非要創建對象才能使用呢?

類只是一種程式內的「設計圖紙」,需要基於圖紙生產實體(對象),才能正常工作**

這種套路,稱之為:面向對象編程

image-20221022234559256

三、類的構造方法

image-20221022234701546

程式碼中,為對象的屬性賦值需要依次進行,略顯繁瑣。

使用構造方法可以簡化賦值操作

描述

Python類可以使用:_init_()方法,稱之為構造方法。

可以實現:

  • 在創建類對象(構造類)的時候,會自動執行。
  • 在創建類對象(構造類)的時候,將傳入參數自動傳遞給___init_()__方法使用。

使用

class Stu:
	name = None
	age = None

	def __init__(self, name, age):
		self.name = name
		self.age = age

	# 注意:在類的方法參數中,要加入self參數,相當於java的this關鍵字(表示類對象本身)
	def say(self):
		print("hello")

student = Stu("郜宇博",21)
print(student.age)
print(student.name)

image-20221022235250167

注意

不要忘記init前後都有2個下劃線

構造方法也是成員方法,不要忘記在參數列表中提供:self

構造方法內定義成員變數,需要使用self關鍵字

四、魔術方法

內置的類方法,各自有各自特殊的功能,這些內置方法我們稱之為:魔術方法

image-20221022235622322

方法 功能
init 構造方法,可用於創建類對象的時候設置初始化行為
str 用於實現類對象轉字元串的行為
lt 用於2個類對象進行小於或大於比較
le 用於2個類對象進行小於等於或大於等於比較
eq 用於2個類對象進行相等比較

1._str_()字元串方法

類似於java的toString()方法

在列印類對象時,將原來的列印記憶體資訊轉換為自定義列印格式

class Stu:
	name = None
	age = None

	# 注意:在類的方法參數中,要加入self參數,相當於java的this關鍵字(表示類對象本身)
	def say(self):
		print("hello")

	def __init__(self, name, age):
		self.name = name
		self.age = age
	def __str__(self):
		return f"姓名:{self.name},年齡:{self.age}"
student = Stu("郜宇博",21)
print(student)

image-20221022235916194

2._lt_()字元串方法

在進行比較時,可以直接使用 > < 符號進行比較(指定比較的數據)

class Stu:
	name = None
	age = None

	def __init__(self, name, age):
		self.name = name
		self.age = age
		
	# Less than的簡稱
	def __lt__(self, other):
		return self.age < other.age
student_1 = Stu("郜宇博",21)
student_2 = Stu("郜宇博",50)
# 相當於比較年齡的大小
print(student_1 < student_2)

image-20221023000433771

五、封裝

面向對象包含3大主要特性:

  • 封裝
  • 繼承
  • 多態

image-20221023000559298

現實世界中的事物,有屬性和行為。

但是不代表這些屬性和行為都是開放給用戶使用的

既然現實事物有不公開的屬性和行為,那麼作為現實事物在程式中映射的類,也應該支援。

描述

類中提供了私有成員的形式來支援。

  • 私有成員變數
  • 私有成員方法

在類中定義的私有變數和方法只能類的內部使用

只需要在定義變數、方法名時前面添加兩個下劃線符號__

class Stu:
	name = None
	age = None
	__gender = '男'

stuent = Stu()
print(stuent.gender)

image-20221023000948260

六、繼承

image-20221023001115000

每一款手機都是基於老款的設計圖,修修改改

1. 程式碼

如下程式碼很複雜,需要引入繼承來簡化程式碼

image-20221023001227932

引入繼承

image-20221023001334330

如下為多繼承

pass關鍵字

代表不執行,空實現,可以用來構建空類,空方法,抽象方法

2. 多繼承

image-20221023001427677 image-20221023001618126

注意

image-20221023001637282

多個父類中,如果有同名的成員,那麼默認以繼承順序(從左到右)為優先順序。

即:先繼承的保留,後繼承的被覆蓋

image-20221023001653228

3. 複寫

子類繼承父類的成員屬性和成員方法後,如果對其「不滿意」,那麼可以進行複寫。

即:在子類中重新定義同名的屬性或方法

class Stu:
   name = None
   age = None

   def    say(self):
      print("我是學生")

class Man(Stu):
   gender = '男'
   def say(self):
      print("我是男學生")

student = Man()
# 相當於調用Man類重寫的say()方法
student.say()

image-20221023002207355

4.調用父類

方式1:使用父類名調用

  • 使用成員變數:父類名.成員變數
  • 使用成員方法:父類名.成員方法(self)

方式2:使用super()調用父類成員

  • 使用成員變數:super().成員變數
  • 使用成員方法:super().成員方法(
class Stu:
	name = None
	age = None

	def	say(self):
		print("我是學生")

class Man(Stu):
	gender = '男'
	def say(self):
		print("我是男學生")
	def student_say(self):
		# 調用了父類的方法,兩種方法都可以
		# Stu.say(self)
		super().say()

student = Man()
# 此方法中調用了父類的方法
student.student_say()

image-20221023002531560

七、類型注釋

在PyCharm中編寫程式碼,我們經常能夠見到如下提示:

image-20221023002619151

因為:PyCharm確定這個對象,是list類型

但是自定義一個函數func,接收一個參數data

PyCharm不會在做出任何提示了

image-20221023002733155

此時使用類型注釋就可以幫助編輯器進行程式碼提示或編寫人員的自我提示

注意:

不會真正的對類型做驗證和判斷。

也就是,類型註解僅僅是提示性的,不是決定性的

1.變數的類型注釋

在變數名後加入冒號:和數據類型

from typing import Dict, List
# int類型
var_1: int = 10
# str類型
var_2: str = "adsad"
# list類型
var_3: list = [1, 2, 3]
var_3_1: List[int] = [1, 2, 3]
# dict類型
var_4: dict = {"age": 10, "name": 20}
var_4_1: Dict[str, int] = {"age": 10, "name": 20}


# 類對象
class Student:
    pass

s: Student = Student()

或者使用注釋的方法

image-20221023004135358

2.函數

形參的類型注釋

def func(data : list):
	pass

表明類型後,就可以對變數進行程式碼提示了

image-20221023004206239

返回值的類型注釋

def func(data : list) -> int:
	pass

3. Union類型

當列表、字典中數據類型不一致時,需要使用到該函數

Union[類型1,類型2]

from typing import List, Union

var : List[Union[int, str, bool]] = [1, "sss", True]

八、多態

多態,指的是:多種狀態,即完成某個行為時,使用不同的對象會得到不同的狀態。

image-20221023004830874 image-20221023004840667

抽象類

class AC:
	def cold(self):
		pass
	def hot(self):
		pass

使用

class AC:
   def cold(self):
      pass
   def hot(self):
      pass

class Midea(AC):
   def cold(self):
      print("美的cold")

   def hot(self):
      print("美的hot")

class Gree(AC):
   def cold(self):
      print("格力cold")

   def hot(self):
      print("格力hot")

def to_cold(ac : AC):
   ac.cold()

gree : Gree = Gree()
midea : Midea = Midea()

to_cold(gree) # 輸出格力cold

image-20221023005403511