詳解Python類(lèi)和對(duì)象內(nèi)容
一、什么是Python類(lèi)?
python中的類(lèi)是創(chuàng)建特定對(duì)象的藍(lán)圖。它使您可以以特定方式構(gòu)建軟件。問(wèn)題來(lái)了,怎么辦?類(lèi)允許我們以一種易于重用的方式對(duì)我們的數(shù)據(jù)和函數(shù)進(jìn)行邏輯分組,并在需要時(shí)進(jìn)行構(gòu)建??紤]下圖。

在第一張圖片(A)中,它代表了一個(gè)可以被視為Class的房子的藍(lán)圖。使用相同的藍(lán)圖,我們可以創(chuàng)建多個(gè)房屋,這些可以視為Objects。使用類(lèi),您可以為您的程序添加一致性,以便以更簡(jiǎn)潔、更有效的方式使用它們。屬性是通過(guò)點(diǎn)表示法訪問(wèn)的數(shù)據(jù)成員(類(lèi)變量和實(shí)例變量)和方法。
- 類(lèi)變量是一個(gè)類(lèi)的所有不同對(duì)象/實(shí)例共享的變量。
- 實(shí)例變量是每個(gè)實(shí)例唯一的變量。它是在方法內(nèi)部定義的,并且只屬于類(lèi)的當(dāng)前實(shí)例。
- 方法也稱為函數(shù),它們?cè)陬?lèi)中定義并描述對(duì)象的行為。
現(xiàn)在,讓我們繼續(xù)前進(jìn),看看它在PyCharm中是如何工作的。要開(kāi)始,首先看一下python類(lèi)的語(yǔ)法。
語(yǔ)法:
class Class_name: statement-1 . . statement-N
在這里,“class”語(yǔ)句創(chuàng)建了一個(gè)新的類(lèi)定義。類(lèi)的名稱緊跟在python中的關(guān)鍵字“class”之后,后跟一個(gè)冒號(hào)。要在python中創(chuàng)建一個(gè)類(lèi),請(qǐng)考慮以下示例:
class employee: pass #no attributes and methods emp_1=employee() emp_2=employee() #instance variable can be created manually emp_1.first='aayushi' emp_1.last='Johari' emp_1.email='aayushi@edureka.co' emp_1.pay=10000 emp_2.first='test' emp_2.last='abc' emp_2.email='test@company.com' emp_2.pay=10000 print(emp_1.email) print(emp_2.email)
輸出–
aayushi@edureka.co
test@company.com
現(xiàn)在,如果我們不想手動(dòng)設(shè)置這些變量怎么辦。你會(huì)看到很多代碼,而且很容易出錯(cuò)。所以為了讓它自動(dòng),我們可以使用“init”方法。為此,讓我們了解一下Python類(lèi)中的方法和屬性到底是什么。
二、Python類(lèi)中的方法和屬性
2.1、Python類(lèi)中的方法
如果沒(méi)有一些功能,現(xiàn)在創(chuàng)建一個(gè)類(lèi)是不完整的。因此,可以通過(guò)設(shè)置各種屬性來(lái)定義功能,這些屬性充當(dāng)與這些屬性相關(guān)的數(shù)據(jù)和功能的容器。python中的函數(shù)也稱為方法。談到init方法,它是一個(gè)特殊的函數(shù),每當(dāng)實(shí)例化該類(lèi)的新對(duì)象時(shí)都會(huì)調(diào)用它。您可以將其視為initialize方法,或者如果您來(lái)自任何其他面向?qū)ο蟮木幊瘫尘埃鏑++、Java等,則可以將其視為構(gòu)造函數(shù)?,F(xiàn)在當(dāng)我們?cè)陬?lèi)中設(shè)置方法時(shí),它們會(huì)自動(dòng)接收實(shí)例。讓我們繼續(xù)使用python類(lèi)并使用此方法接受名字、姓氏和薪水。
class employee:
def __init__(self, first, last, sal):
self.fname=first
self.lname=last
self.sal=sal
self.email=first + '.' + last + '@company.com'
emp_1=employee('aayushi','johari',350000)
emp_2=employee('test','test',100000)
print(emp_1.email)
print(emp_2.email)
現(xiàn)在在我們的“init”方法中,我們?cè)O(shè)置了這些實(shí)例變量(self、first、last、sal)。Self是實(shí)例,這意味著每當(dāng)我們寫(xiě)self.fname=first時(shí),它與emp_1.first='aayushi'相同。然后我們創(chuàng)建了員工類(lèi)的實(shí)例,我們可以在其中傳遞init方法中指定的值。此方法將實(shí)例作為參數(shù)?,F(xiàn)在它將自動(dòng)完成,而不是手動(dòng)完成。
接下來(lái),我們希望能夠執(zhí)行某種操作。為此,我們將向此類(lèi)添加一個(gè)方法。假設(shè)我想要顯示員工全名的功能。因此,讓我們實(shí)際實(shí)現(xiàn)這一點(diǎn)。
class employee:
def __init__(self, first, last, sal):
self.fname=first
self.lname=last
self.sal=sal
self.email=first + '.' + last + '@company.com'
def fullname(self):
return '{}{}'.format(self.fname,self.lname)
emp_1=employee('aayushi','johari',350000)
emp_2=employee('test','test',100000)
print(emp_1.email)
print(emp_2.email)
print(emp_1.fullname())
print(emp_2.fullname())
輸出–
aayushi.johari@company.com
test.test@company.com
aayushijohari
TESTTEST
正如你在上面看到的,我在一個(gè)類(lèi)中創(chuàng)建了一個(gè)名為“全名”的方法。因此,python類(lèi)中的每個(gè)方法都會(huì)自動(dòng)將實(shí)例作為第一個(gè)參數(shù)?,F(xiàn)在在這個(gè)方法中,我編寫(xiě)了打印全名并返回這個(gè)而不是emp_1名字和姓氏的邏輯。接下來(lái),我使用了“self”,以便它適用于所有實(shí)例。因此每次都打印這個(gè),我們使用一個(gè)方法。
繼續(xù)使用Python類(lèi),有一些變量在類(lèi)的所有實(shí)例之間共享。這些被稱為類(lèi)變量。實(shí)例變量對(duì)于每個(gè)實(shí)例都可以是唯一的,例如姓名、電子郵件、sal等。復(fù)雜嗎?讓我們通過(guò)一個(gè)例子來(lái)理解這一點(diǎn)。請(qǐng)參閱下面的代碼以了解工資的年度增長(zhǎng)情況。
class employee:
perc_raise =1.05
def __init__(self, first, last, sal):
self.fname=first
self.lname=last
self.sal=sal
self.email=first + '.' + last + '@company.com'
def fullname(self):
return '{}{}'.format(self.fname,self.lname)
def apply_raise(self):
self.sal=int(self.sal*1.05)
emp_1=employee('aayushi','johari',350000)
emp_2=employee('test','test',100000)
print(emp_1.sal)
emp_1.apply_raise()
print(emp_1.sal)
輸出–
350000
367500
正如你在上面看到的,我先打印了工資,然后應(yīng)用了1.5%的增長(zhǎng)。為了訪問(wèn)這些類(lèi)變量,我們需要通過(guò)類(lèi)或類(lèi)的實(shí)例來(lái)訪問(wèn)它們?,F(xiàn)在,讓我們了解Python類(lèi)中的各種屬性。
2.2、Python類(lèi)中的屬性
Python中的屬性定義了對(duì)象、元素或文件的屬性。有兩種類(lèi)型的屬性:
內(nèi)置類(lèi)屬性:Python類(lèi)中存在各種內(nèi)置屬性。例如_dict_、_doc_、_name _等。讓我舉同樣的例子,我想查看employee1的所有鍵值對(duì)。為此,您可以簡(jiǎn)單地編寫(xiě)以下包含類(lèi)命名空間的語(yǔ)句:
打印
(emp_1.__dict__)
執(zhí)行之后,你會(huì)得到這樣的輸出:
{'fname': 'aayushi', 'lname': 'johari', 'sal': 350000, 'email': 'aayushi.johari@company.com'}
用戶定義的屬性:屬性是在類(lèi)定義中創(chuàng)建的。我們可以為類(lèi)的現(xiàn)有實(shí)例動(dòng)態(tài)創(chuàng)建新屬性。屬性也可以綁定到類(lèi)名。
接下來(lái),我們有public、protected和private屬性。讓我們?cè)敿?xì)了解它們:

接下來(lái),讓我們了解一個(gè)python類(lèi)中最重要的組件,即Objects。

正如我們上面討論的,一個(gè)對(duì)象可以用來(lái)訪問(wèn)不同的屬性。它用于創(chuàng)建類(lèi)的實(shí)例。實(shí)例是在運(yùn)行時(shí)創(chuàng)建的類(lèi)的對(duì)象。
給你一個(gè)快速瀏覽,對(duì)象主要是看到周?chē)囊磺小@纾汗肥莿?dòng)物類(lèi)的對(duì)象,我是人類(lèi)類(lèi)的對(duì)象。同樣,同一個(gè)電話類(lèi)可以有不同的對(duì)象。這與我們已經(jīng)討論過(guò)的函數(shù)調(diào)用非常相似。讓我們通過(guò)一個(gè)例子來(lái)理解這一點(diǎn):
class MyClass:
def func(self):
print('Hello')
# create a new MyClass
ob = MyClass()
ob.func()
繼續(xù)使用python類(lèi),讓我們了解各種OOP概念。
三、面向?qū)ο蟮母拍?/h2>
OOPs指的是Python中的面向?qū)ο缶幊?。好吧,Python并不是完全面向?qū)ο蟮?,因?yàn)樗恍┻^(guò)程函數(shù)?,F(xiàn)在,您一定想知道過(guò)程編程和面向?qū)ο缶幊讨g有什么區(qū)別。為了消除您的疑問(wèn),在過(guò)程式編程中,整個(gè)代碼都被寫(xiě)入一個(gè)長(zhǎng)過(guò)程,即使它可能包含函數(shù)和子例程。由于數(shù)據(jù)和邏輯混合在一起,因此無(wú)法管理。但是當(dāng)我們談?wù)撁嫦驅(qū)ο缶幊虝r(shí),程序被拆分為獨(dú)立的對(duì)象或幾個(gè)小程序。每個(gè)對(duì)象代表應(yīng)用程序的不同部分,這些部分有自己的數(shù)據(jù)和邏輯來(lái)在它們之間進(jìn)行通信。例如,一個(gè)網(wǎng)站有不同的對(duì)象,如圖像、視頻等。
面向?qū)ο缶幊贪≒ython類(lèi)、對(duì)象、繼承、多態(tài)、抽象等概念,下面讓我們?cè)敿?xì)了解這些主題。
3.1、Python類(lèi):繼承
繼承允許我們從基類(lèi)/父類(lèi)繼承屬性和方法。這很有用,因?yàn)槲覀兛梢詣?chuàng)建子類(lèi)并從父類(lèi)中獲取所有功能。然后我們可以在不影響父類(lèi)的情況下覆蓋和添加新功能。讓我們通過(guò)一個(gè)例子來(lái)理解父類(lèi)和子類(lèi)的概念。

正如我們?cè)趫D像中看到的,孩子繼承了父親的屬性。同樣,在python中,有兩個(gè)類(lèi):
1.父類(lèi)(Super或Base類(lèi))
2.子類(lèi)(子類(lèi)或派生類(lèi))
繼承屬性的類(lèi)稱為子類(lèi),而繼承屬性的類(lèi)稱為父類(lèi)。
繼承是指創(chuàng)建包含其父類(lèi)的專業(yè)化的子類(lèi)的能力。它進(jìn)一步分為四種類(lèi)型,即單繼承、多級(jí)繼承、分層繼承和多重繼承。請(qǐng)參考下圖以獲得更好的理解。

讓我們繼續(xù)使用python類(lèi)并了解繼承是如何有用的。
比如說(shuō),我想為員工類(lèi)型創(chuàng)建類(lèi)。我將創(chuàng)建'developers'和'managers'作為子類(lèi),因?yàn)殚_(kāi)發(fā)人員和經(jīng)理都有姓名、電子郵件和薪水,所有這些功能都在員工類(lèi)中。因此,我們不必復(fù)制子類(lèi)的代碼,而是可以通過(guò)從員工那里繼承來(lái)簡(jiǎn)單地重用代碼。
class employee:
num_employee=0
raise_amount=1.04
def __init__(self, first, last, sal):
self.first=first
self.last=last
self.sal=sal
self.email=first + '.' + last + '@company.com'
employee.num_employee+=1
def fullname (self):
return '{} {}'.format(self.first, self.last)
def apply_raise (self):
self.sal=int(self.sal * raise_amount)
class developer(employee):
pass
emp_1=developer('aayushi', 'johari', 1000000)
print(emp_1.email)
輸出-
aayushi.johari@company.com
正如您在上面的輸出中看到的,employee類(lèi)的所有詳細(xì)信息都可以在developer類(lèi)中找到?,F(xiàn)在,如果我想將開(kāi)發(fā)人員的raise_amount更改為10%怎么辦?讓我們看看它是如何實(shí)際完成的。
class employee:
num_employee=0
raise_amount=1.04
def __init__(self, first, last, sal):
self.first=first
self.last=last
self.sal=sal
self.email=first + '.' + last + '@company.com'
employee.num_employee+=1
def fullname (self):
return '{} {}'.format(self.first, self.last)
def apply_raise (self):
self.sal=int(self.sal* raise_amount)
class developer(employee):
raise_amount = 1.10
emp_1=developer('aayushi', 'johari', 1000000)
print(emp_1.raise_amount)
如您所見(jiàn),它已將工資增長(zhǎng)百分比從4%更新為10%?,F(xiàn)在,如果我想再添加一個(gè)屬性,比如在我們的init方法中使用一種編程語(yǔ)言,但它在我們的父類(lèi)中不存在。有什么解決辦法嗎?是的!我們可以復(fù)制整個(gè)員工邏輯并這樣做,但它會(huì)再次增加代碼大小。因此,為了避免這種情況,讓我們考慮以下代碼:
class employee:
num_employee=0
raise_amount=1.04
def __init__(self, first, last, sal):
self.first=first
self.last=last
self.sal=sal
self.email=first + '.' + last + '@company.com'
employee.num_employee+=1
def fullname (self):
return '{} {}'.format(self.first, self.last)
def apply_raise (self):
self.sal=int(self.sal* raise_amount)
class developer(employee):
raise_amount = 1.10
def __init__(self, first, last, sal, prog_lang):
super().__init__(first, last, sal)
self.prog_lang=prog_lang
emp_1=developer('aayushi', 'johari', 1000000, 'python')
print(emp_1.prog_lang)
因此,只用一點(diǎn)點(diǎn)代碼,我就進(jìn)行了更改。我使用了super.__init__(first, last, pay)它繼承了基類(lèi)的屬性??傊^承用于重用代碼并降低程序的復(fù)雜性。
3.2、Python類(lèi):多態(tài)性
計(jì)算機(jī)科學(xué)中的多態(tài)性是為不同的底層形式呈現(xiàn)相同界面的能力。實(shí)際上,多態(tài)意味著如果類(lèi)B從類(lèi)A繼承,它不必繼承關(guān)于類(lèi)A的所有內(nèi)容,它可以做一些與類(lèi)A不同的事情。它最常用于處理繼承。Python是隱式多態(tài)的,它能夠重載標(biāo)準(zhǔn)運(yùn)算符,以便它們根據(jù)上下文具有適當(dāng)?shù)男袨椤?/p>
讓我們通過(guò)一個(gè)例子來(lái)理解:
class Animal:
def __init__(self,name):
self.name=name
def talk(self):
pass
class Dog(Animal):
def talk(self):
print('Woof')
class Cat(Animal):
def talk(self):
print('MEOW!')
c= Cat('kitty')
c.talk()
d=Dog(Animal)
d.talk()
輸出-
Meow!Woof
接下來(lái),讓我們轉(zhuǎn)向另一個(gè)面向?qū)ο蟮木幊谈拍睿闯橄蟆?/p>
3.3、Python類(lèi):抽象
抽象用于通過(guò)建模適合問(wèn)題的類(lèi)來(lái)簡(jiǎn)化復(fù)雜的現(xiàn)實(shí)。在這里,我們有一個(gè)無(wú)法實(shí)例化的抽象類(lèi)。這意味著您不能為這些類(lèi)創(chuàng)建對(duì)象或?qū)嵗K荒苡糜诶^承您稱為基類(lèi)的某些功能。因此,您可以繼承功能,但同時(shí),您無(wú)法創(chuàng)建此特定類(lèi)的實(shí)例。讓我們通過(guò)下面的例子來(lái)理解抽象類(lèi)的概念:
from abc import ABC, abstractmethod
class Employee(ABC):
@abstractmethod
def calculate_salary(self,sal):
pass
class Developer(Employee):
def calculate_salary(self,sal):
finalsalary= sal*1.10
return finalsalary
emp_1 = Developer()
print(emp_1.calculate_salary(10000))
輸出–
11000.0
正如你在上面的輸出中看到的,我們已經(jīng)將基本工資增加到10%,即現(xiàn)在的工資是11000?,F(xiàn)在,如果你真的繼續(xù)創(chuàng)建一個(gè)“Employee”類(lèi)的對(duì)象,它會(huì)拋出一個(gè)錯(cuò)誤,因?yàn)閜ython不會(huì)'不允許你創(chuàng)建抽象類(lèi)的對(duì)象。但是使用繼承,您實(shí)際上可以繼承屬性并執(zhí)行相應(yīng)的任務(wù)。
以上就是詳解Python類(lèi)和對(duì)象內(nèi)容的詳細(xì)內(nèi)容,更多關(guān)于Python類(lèi)和對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python WXPY實(shí)現(xiàn)微信監(jiān)控報(bào)警功能的代碼
本篇文章主要介紹了Python WXPY實(shí)現(xiàn)微信監(jiān)控報(bào)警功能的代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Python實(shí)現(xiàn)在一行中交換兩個(gè)變量
Python3+selenium實(shí)現(xiàn)cookie免密登錄的示例代碼
Python連接MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)單便捷方法

