網(wǎng)站首頁 編程語言 正文
視頻
觀看視頻
Python 類和對象
面向?qū)ο缶幊淌蔷帉懕硎粳F(xiàn)實世界中的事物和情景的類,并基于這些類來創(chuàng)建對象。
編寫類時,你定義一大類對象都有的通用行為。基于類創(chuàng)建對象時,每個對象都自動具備這種通用行為,然后可根據(jù)需要賦予每個對象獨特的個性。使用面向?qū)ο缶幊炭赡M現(xiàn)實情景,其逼真程度達到了令你驚訝的地步。
根據(jù)類來創(chuàng)建對象被稱為實例化,這是能夠使用類的實例。
面向?qū)ο笞钪匾母拍罹褪穷悾–lass)和實例(Instance),必須牢記類是抽象的模板,比如Dog類,而實例是根據(jù)類創(chuàng)建出來的一個個具體的“對象”,每個對象都擁有相同的方法,但各自的數(shù)據(jù)可能不同。
創(chuàng)建和使用類
Python定義類是通過class
關(guān)鍵字:
class Dog(object): # 若不提供object,默認的也是object pass
class
后面跟著類名,即Dog
,類名通常首字母大寫,(object)
表示該類是從哪個類繼承下來的,如果沒有合適的繼承類,就使用object
類,這是所有類最終都會繼承的類。
可以創(chuàng)建Dog
類的實例,創(chuàng)建實例是通過類名+()
實現(xiàn)的:
>>> bart = Dog() >>> bart <__main__.Dog object at 0x10a67a590> >>> Dog <class '__main__.Dog'>
變量bart
指向的是一個Dog
的實例,后面的0x10a67a590
是內(nèi)存地址,每個object的地址都不一樣,Dog
是一個類。
假設(shè)Dog類創(chuàng)建的每個實例都將存儲名字和年齡。賦予每條小狗蹲下sit()
和打滾roll_over()
的能力:
dog.py
class Dog(): """一次模擬小狗的簡單嘗試""" def __init__(self, name, age): """初始化屬性name和age""" self.name = name self.age = age def sit(self): """模擬小狗被命令時蹲下""" print(self.name.title() + " is now sitting.") def roll_over(self): """模擬小狗被命令時打滾""" print(self.name.title() + " rolled over!")
第1行:定義了一個名為Dog的類。根據(jù)約定,在Python中,首字母大寫的名稱指的是類。這個類定義中的括號是空的,因為要從空白創(chuàng)建這個類。
第2行:編寫了一個文檔字符串,對這個類的功能作了描述。
方法__init__()
類中的函數(shù)稱為方法;有關(guān)函數(shù)的一切都適用于方法,就目前而言,唯一重要的差別是調(diào)用方法的方式。
第3行:方法__init__()
是一個特殊的方法,每當你根據(jù)Dog類創(chuàng)建新實例時,Python都會自動運行它。在這個方法的名稱中,開頭和末尾各有兩個下劃線,這是一種約定,旨在避免Python默認方法與普通方法發(fā)生名稱沖突。
將方法__init__()
定義成了包含三個形參:self、name和age。在這個方法的定義中,形參self必不可少,還必須位于其他形參的前面。為何必須在方法定義中包含形參self呢?因為,Python調(diào)用這個__init__()
方法來創(chuàng)建Dog實例時,將自動傳入實參self。每個與類相關(guān)聯(lián)的方法調(diào)用都自動傳遞實參self,它是一個指向?qū)嵗旧淼囊茫寣嵗軌蛟L問類中的屬性和方法。
創(chuàng)建Dog實例時,Python將調(diào)用Dog類的方法__init__()
。將通過實參向Dog()傳遞名字和年齡;self會自動傳遞,因此不需要傳遞它。每當根據(jù)Dog類創(chuàng)建實例時,都只需給最后兩個形參(name和age)提供值。
第5、6行:定義的兩個變量都有前綴self。以self為前綴的變量都可供類中的所有方法使用,還可以通過類的任何實例來訪問這些變量。self.name = name
獲取存儲在形參name中的值,并將其存儲到變量name中,然后該變量被關(guān)聯(lián)到當前創(chuàng)建的實例。self.age = age的作用與此類似。
像這樣可通過實例訪問的變量稱為屬性。
Dog類還定義了另外兩個方法:sit()和roll_over()
。由于這些方法不需要額外的信息,如名字或年齡,因此它們只有一個形參self。后面將創(chuàng)建的實例能夠訪問這些方法,換句話說,它們都會蹲下和打滾。
根據(jù)類創(chuàng)建實例
可將類視為有關(guān)如何創(chuàng)建實例的說明。Dog類是一系列說明,讓Python知道如何創(chuàng)建表示特定小狗的實例。
下面來創(chuàng)建一個表示特定小狗的實例:
my_dog = Dog('willie', 6) print("My dog's name is " + my_dog.name.title() + ".") print("My dog is " + str(my_dog.age) + " years old.")
第1行:讓Python創(chuàng)建一條名字為’willie’、年齡為6的小狗。遇到這行代碼時,Python使用實參’willie’和6調(diào)用Dog類中的方法__init__()
。
方法__init__()
創(chuàng)建一個表示特定小狗的示例,并使用提供的值來設(shè)置屬性name和age。方法__init__()
并未顯式地包含return語句,但Python自動返回一個表示這條小狗的實例。將這
個實例存儲在變量my_dog中。在這里,命名約定很有用:通常可以認為首字母大寫的名稱指的是類,而小寫的名稱指的是根據(jù)類創(chuàng)建的實例。
訪問屬性
要訪問實例的屬性,可使用句點表示法。
第2行:編寫了如下代碼來訪問my_dog的屬性name的值:
my_dog.name
句點表示法在Python中很常用,這種語法演示了Python如何獲悉屬性的值。在這里,Python先找到實例my_dog,再查找與這個實例相關(guān)聯(lián)的屬性name。在Dog類中引用這個屬性時,使用的是self.name
。在前面的第1條print語句中,my_dog.name.title()
將my_dog的屬性name的值’willie’改為首字母大寫的;在第2條print語句中,str(my_dog.age)
將my_dog的屬性age的值6轉(zhuǎn)換為字符串。
輸出是有關(guān)my_dog的摘要:
My dog’s name is Willie.
My dog is 6 years old.
調(diào)用方法
根據(jù)Dog類創(chuàng)建實例后,就可以使用句點表示法來調(diào)用Dog類中定義的任何方法。下面來讓小狗蹲下和打滾:
my_dog = Dog('willie', 6) my_dog.sit() my_dog.roll_over()
要調(diào)用方法,可指定實例的名稱和要調(diào)用的方法,并用句點分隔它們。遇到代碼my_dog.sit()
時,Python在類Dog中查找方法sit()
并運行其代碼。
Willie按的命令做了:
Willie is now sitting.
Willie rolled over!
這種語法很有用。如果給屬性和方法指定了合適的描述性名稱,如name、age、sit()和roll_over()
,即便是從未見過的代碼塊,也能夠輕松地推斷出它是做什么的。
創(chuàng)建多個實例
可按需求根據(jù)類創(chuàng)建任意數(shù)量的實例。下面再創(chuàng)建一個名為your_dog的實例:
my_dog = Dog('willie', 6) your_dog = Dog('lucy', 3) print("My dog's name is " + my_dog.name.title() + ".") print("My dog is " + str(my_dog.age) + " years old.") my_dog.sit() print("\nYour dog's name is " + your_dog.name.title() + ".") print("Your dog is " + str(your_dog.age) + " years old.") your_dog.sit()
在這個實例中,創(chuàng)建了兩條小狗,它們分別名為Willie和Lucy。每條小狗都是一個獨立
的實例,有自己的一組屬性,能夠執(zhí)行相同的操作:
My dog’s name is Willie.
My dog is 6 years old.
Willie is now sitting.
Your dog’s name is Lucy.
Your dog is 3 years old.
Lucy is now sitting.
就算給第二條小狗指定同樣的名字和年齡,Python依然會根據(jù)Dog類創(chuàng)建另一個實例。
你可按需求根據(jù)一個類創(chuàng)建任意數(shù)量的實例,條件是將每個實例都存儲在不同的變量中,或占用列表或字典的不同位置。
原文鏈接:https://acktomas.blog.csdn.net/article/details/125928112
相關(guān)推薦
- 2023-07-02 cv2.imread?和?cv2.imdecode?用法及區(qū)別_python
- 2022-07-09 kubernetes之資源限制
- 2022-12-01 Go初學(xué)者踩坑之go?mod?init與自定義包的使用_Golang
- 2022-05-12 Android Studio 崩潰一閃而過抓不到日志
- 2022-07-18 SQL?Server中實現(xiàn)錯誤處理_MsSql
- 2022-08-29 .NET?Core使用Eureka實現(xiàn)服務(wù)注冊_實用技巧
- 2022-04-24 C++vector的用法你都知道嘛_C 語言
- 2022-06-12 C#實現(xiàn)基于任務(wù)的異步編程模式_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支