首頁 >後端開發 >Python教學 >Python物件導向程式設計-初級篇

Python物件導向程式設計-初級篇

王林
王林轉載
2023-04-11 23:58:051951瀏覽

前言

物件導向 : 採用基於物件(實體) 的概念建立模型,模擬客觀世界分析、設計、實現軟體的辦法。物件導向程式設計(Object-oriented Programming,簡稱OOP)是一種解決軟體重複使用的設計和程式設計方法,把軟體系統中相近相似的操作邏輯和操作應用資料、狀態,以類別的形式描述出來,以對象實例的形式在軟體系統中重複使用,提高軟體開發效率。

物件導向程式設計是Python中一個極為重要的概念。

一、物件導向與流程

1.兩類軟體開發設計方法

  1. 流程導向程式設計:依照業務邏輯從上往下,將需要用到的功能程式碼封裝到函數中,著重在開發的步驟和過程,典型程式碼為C語言(關注過程)
  2. 物件導向程式設計:將函數或所需的功能進行分類和封裝,專注專注於具體哪個類別和函數來實現功能,典型程式碼為Java、C 等語言(專注於結果)

#2.物件導向相關術語

  • 類別(Class) :用來描述具有相同屬性和方法的物件的集合,它定義了該集合中每個物件所共有的屬性和方法,物件是類別的實例。
  • 實例:也稱為物件。透過類別定義的初始化方法,賦予具體的值,成為一個」有血有肉的實體」。
  • 類別變數:類別變數在整個實例化的物件中是公用的。類別變數定義在類別中且在函數體之外。類別變數通常不作為實例變數使用。
  • 資料成員:類別變數或實例變數, 用於處理類別及其實例物件的相關的資料。
  • 方法重寫:如果從父類別繼承的方法不能滿足子類別的需求,可以對其進行改寫,這個過程叫方法的覆寫(override),也稱為方法的重寫。
  • 局部變數:定義在方法中的變量,只作用於目前實例的類別。
  • 實例變數:在類別的宣告中,屬性是用變數來表示的。這種變數就稱為實例變量,是在類別聲明的內部但是在類別的其他成員方法之外聲明的。
  • 方法:類別中定義的函數。
  • 方法重寫:如果從父類別繼承的方法不能滿足子類別的需求,可以對其進行改寫,這個過程叫方法的覆寫(override),也稱為方法的重 寫。
  • 靜態方法:不需要實例化就可以由類別執行的方法。
  • 類別方法:類別方法是將類別本身作為物件進行操作的方法。

物件導向三大特性:

  • 」封裝:將內部實作包裹起來,對外透明,提供api介面進行呼叫的機制。
  • 繼承:即一個衍生類別(derived class)繼承父類別(base class)的變數和方法。
  • 多態:根據物件類型的不同以不同的方式進行處理。

二、類別和物件

1.物件

物件是物件導向程式設計的核心,在使用物件過程中,為了將具有共同特徵和行為的一組物件抽象定義,形成類別

2.類別

1)概念

類別是一類事物,物件就是這一類事物的具體實現,類別具有相同的屬性和行為

2)類別(class)的組成

  • 類別名稱:類別的名稱
  • 屬性:事物的特徵
  • 方法:具體做什麼

3)抽象

擁有相同或類似屬性和行為的物件都可以抽象化成一個類別

4)類的分類

建立類別使用class關鍵字,帶上類別名,再帶上括號,括號內為object,這樣的類別稱為:新式類別;也可以不帶括號和括號內的object,這樣的類別稱為:經典類別。

# 新式类 
class Meeting2(object): 
pass 
# 经典类 
class Meeting2: 
pass

5)建立物件

A = Meeting1() 
B

6)self

類別方法的第一個參數必須是self(按慣例是self,也可以是其他名稱),調用時不必傳入。 self代表類別的實例

三、取得或新增物件屬性

如下有個名為meeting的類,類別中初始化了name、age、sex、address、attack等屬性,定義了introduction和attacked兩個方法:

class Meeting(object):
"""meeting类的类描述"""

def __init__(self, name, age, sex, address, attack):
"""构造函数"""
self.name = name
self.age = int(age)
self.sex = sex
self.address = address
self.attack = int(attack)

def introduction(self):
print("姓名:{}".format(self.name))
print("年龄:{}".format(self.age))
print("性别:{}".format(self.sex))
print("地址:{}".format(self.address))

def attacked(self):
print(f"{self.name}正在向您发起攻击,攻击力为{self.attack}!")

def foreign_fun():
print("我是外部函数")

1.hasattr-檢查物件是否包含指定屬性或方法

用法:

hasattr(object,name)

作用:檢查物件中是否包含指定屬性或方法

傳回值:存在傳回true、不存在回傳false

# 实例化meeting类
Meeting = Meeting("张三", 20, "男", "南京", 108)

# 获取Meeting对象中是否存在name属性
print(hasattr(Meeting, "name"))# True
# 获取Meeting对象中是否存在mobile属性
print(hasattr(Meeting, "mobile"))# False
# 获取Meeting对象中是否存在attacked方法
print(hasattr(Meeting, "attacked"))# True

2.getattr-取得物件中指定屬性的屬性值

用法:

getattr(object,name[,default])

作用:取得物件中指定屬性的屬性值

傳回值:若存在,則傳回該屬性的屬性值;若不存在,則傳回指定內容

# 实例化meeting类
Meeting = Meeting("张三", 20, "男", "南京", 108)

# 获取Meeting对象中name属性的属性值
print(getattr(Meeting, "name"))# 张三
# 获取Meeting对象中kills属性或方法的值,若不存在则返回指定内容
print(getattr(Meeting, "kills", "未找到kills方法或属性"))# 未找到kills方法或属性
# 获取Meeting对象中attacked方法,返回值为函数地址
print(getattr(Meeting, "attacked"))
# 使用getattr方法可以直接调用Meeting对象中的方法
f = getattr(Meeting, "attacked")
f()

列印結果如下:

Python物件導向程式設計-初級篇

3.setattr-为object对象的name属性设置指定value

用法:

setattr(object,name,value)

作用:为object对象的指定属性设置指定value

返回值:

# 实例化meeting类
Meeting = Meeting("张三", 20, "男", "南京", 108)

# 将对象中name属性的值改为“刘德华”
setattr(Meeting, "name", "刘德华")
# 获取对象中name的属性值
print(getattr(Meeting, "name"))# 刘德华
# 将对象外部的名为foreign_fun的方法引入对象内部,并重新命名为“new_foreign_fun”
setattr(Meeting, "new_foreign_fun", foreign_fun)
# 获取对象中是否存在foreign_fun的属性或方法,返回值为True或False
print(hasattr(Meeting, "foreign_fun"))# False
# 获取对象中是否存在new_foreign_fun的属性或方法,返回值为True或False
print(hasattr(Meeting, "new_foreign_fun"))# True

打印结果如下:

Python物件導向程式設計-初級篇

四、魔法方法

1.__init__() 构造函数

__init__()方法是Python中一种特殊的方法,被称为构造函数或初始化方法,当创建这个类的实例时就会调用该方法。

class Meeting(object):
"""meeting类的类描述"""

def __init__(self, name, age, sex, address, attack):
"""构造函数"""
self.name = name
self.age = int(age)
self.sex = sex
self.address = address
self.attack = int(attack)

C = Meeting("张三", 20, "男", "南京", 108)
print(C.name)# 张三
print(C.address)# 南京

2.__del__() 析构函数

当删除对象时,Python解释器会默认调用一个方法__del__(),相当于unittest框架中的tearDown()函数

def __del__(self): 
"""析构函数""" 
print("%s攻击结束" % (self.name)) 

每调用一次对象,都会执行一次__del__()方法

Python物件導向程式設計-初級篇

3.引用计数

D = Meeting("张三", 20, "男", "南京", 108)
# 计算当前实例引用计数,D引用一次,sys.getrefcount(D)引用一次
print(sys.getrefcount(D))# 2

D对象的引用计数为2次,一次是D引用,一次是sys.getrefcount所引用的

4.__str()__字符串函数

__str__方法需要返回一个字符串,当做这个对象的描述信息,当使用print输出对象的时候,只要定义了__str__(self)方法,那么就会打印这个方法返回的数据

def __str__(self):
"""字符串函数"""
return "我是Meeting类的字符串描述"
# __str__():字符串函数,定义__str__()方法时,打印对象,打印的是__str__()方法的返回值,否则打印类的内存地址
print(D)# 我是Meeting类的字符串描述
  • 未定义__str__()方法时,打印对象,打印的是Meeting类的内存地址:<__main__.meeting object at0x014a7748>
  • 定义了__str__()方法后,打印对象,打印的是__str__()方法的返回值:我是Meeting类的字符串描述

五、Python的内置属性

1.__dict__:获取类的属性

获取类的属性,包含一个字典,由类的数据属性组成

# __dict__:获取类的属性,返回值为字典类型 
print(D.__dict__) 
# {'name': '张三', 'age': 20, 'sex': '男', 'address': '南京', 'attack': 108} 

2.__doc__:获取类的文档字符串

class Meeting(object): 
 """meeting1类的类描述""" 
 
# __doc__:获取类的文档字符串 
print(D.__doc__) # meeting1类的类描述 

3.__name__:获取类名

# __name__:获取类名 
print(Meeting.__name__) # Meeting 

4.__module__:类定义所在的模块

类的全名是'__main__.clssName',如果类位于一个导入模块mymod中,那么className.__module__等于mymod

from common.http_requests import HttpRequests
# __module__:类定义所在的模块
print(Meeting.__module__)# __main__
print(HttpRequests.__module__)# common.http_requests

Meeting类的路径为__main__,而从common文件的http_requests文件中导入了HttpRequests类,打印其路径,则为common.http_requests

5.__bases__:获取类的所有父类构成元素

获取类的所有父类构成元素(包含了一个由所有父类元素组成的元组)。例如下面有一个Song类,其继承了父类Music,则获取到的Song类的所有父类构成元素为:(,)

class Music(object):
pass

class Song(Music):
pass

print(Song.__bases__)# (<class '__main__.Music'>,)

小结

本篇文章我们介绍了面向对象的相关概念,下面来简单总结一下:

面向对象相关概念:

  • 类和对象:类是一类事物,对象即是这一类事物的具体实现,类具有相同的属性和行为;
  • 类的组成:类名、属性、方法
  • 带object的为新式类,不带object的为经典类

获取或添加对象属性:

  • hasattr:检查对象是否包含指定属性或方法
  • getattr:获取对象中指定属性的属性值
  • setattr:为object对象的name属性设置指定value

魔法方法:

  • __init__() 构造函数:又叫初始化方法,用来初始化一些成员变量
  • __del__() 析构函数:每调用一次对象,都会执行一次__del__()方法,相当于Unittest框架中的tearDown
  • __str()__字符串函数:返回一个字符串,当做这个对象的描述信息

Python内置属性:

  • __dict__:获取类的属性,返回值为字典类型
  • __doc__:获取类的文档字符串
  • __name__:获取类名
  • __module__:类定义所在的模块
  • __bases__:获取类的所有父类构成元素,返回类型为元组

以上是Python物件導向程式設計-初級篇的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除