python基礎(十五) - 面對對象之類和對象


 

前言:本文主要介紹python面對對象中的類和對象,包括類和對象的概念、類的定義、類屬性、實例屬性及實例方法等。

 

一、類和對象的概念


問題:什么是類?什么是實例對象?

類:是一類事物的抽象概念,不是真實存在的,描繪了該類事物共有的特征和行為

  • 例如:貓類、狗類、鳥類、車類等

實例對象:某類事物的具體個體,是該類事物的具體表現,它是真實存在的

  • 例如:“張三”是具體的某個“人“,”二哈“是具體的某個”狗“

 

二、類的定義


關鍵字:class

定義類的方法:

方式一:class 類名:

方式二:class 類名(object):

注意:方式一、方式二本質上是一樣的,沒有任何區別,只是寫法不一樣,他們都繼承object這個基類。這里簡單解釋一下,在python3以前,不繼承object類會少很多可操作對象,這些都是類中的高級特性,但在python3以后所有類都默認繼承這個object基類了。

 

類名的命名規范:

1)遵循標識符的命名規范,即由字母、數字及下划線組成且不能以數字開頭,不能使用關鍵字。

2)建議使用大駝峰命名法(每個單詞的第一個字母大寫,例如:MyClass、TestCase)

 

三、類屬性和實例屬性


1.類屬性

什么是類屬性?就是一類事物的共同特征,比如狗類,共同特征:叫聲(汪汪汪)、四只腳等。

類屬性:就是定義在類中的變量

類屬性的訪問:

  • 類可以直接訪問類屬性
  • 該類的實例對象也可以訪問類屬性
class Dog:  # 創建一個狗類
    cry = '汪汪汪'  # 類屬性
    leg = '四只腳'  # 類屬性


wangcai = Dog()  # 創建一個實例對象,旺財是一只具體的狗
print('通過類名直接訪問類屬性:'.format(Dog.cry))  # 通過類名直接訪問類屬性
print('通過實例對象訪問類屬性:'.format(wangcai.cry))  # 通過實例對象訪問類屬性

運行結果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
通過類名直接訪問類屬性:
通過實例對象訪問類屬性:

Process finished with exit code 0

2.實例屬性

什么是實例屬性?就是實例對象特有的屬性,比如旺財是一個實例對象,他的名字叫旺財,這個名字就是一個實例屬性

實例屬性:實例對象特有的屬性,添加實例屬性的方式:

  • 實例對象.屬性 = 屬性值
  • 定義在類里的__init__方法里的變量

實例屬性的訪問:實例屬性只有該實例對象自己能訪問

class Dog:  # 創建一個狗類
    cry = '汪汪汪'  # 類屬性
    leg = '四只腳'  # 類屬性

    def __init__(self, name, age):
        """實例對象初始化方法"""
        self.name = name
        self.age = age


# 創建一個實例對象,因為有初始化方法__init__,定義了兩個必需參數,因此實例化對象時需要傳兩個參數
wangcai = Dog(name='旺財', age='4')   # wangcai = Dog('旺財', '4')  這種寫法也可以,順序對應參數即可
dog_name = wangcai.name
dog_age = wangcai.age
print('狗的名字:{}'.format(dog_name))  # 實例屬性只能該實例對象訪問
print('狗的年齡:{}'.format(dog_age))

# 通過 實例對象.屬性 = 屬性值 再添加一個實例屬性
wangcai.skill = '爬樹'
print(wangcai.skill)

# print(Dog.name)     # 實例屬性是不能通過類去訪問的,會報錯

jojo = Dog('jojo', 3)   # 實例化對象,一只叫jojo的狗
dog_name2 = jojo.name   # jojo只能訪問自己的屬性,不能訪問其他實例對象(旺財)的屬性
print('狗的名字:{}'.format(dog_name2))

運行結果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
狗的名字:旺財
狗的年齡:4
爬樹
狗的名字:jojo

Process finished with exit code 0

在上面例子中使用了一個__init__方法,這些是什么方法呢?被雙下划線包起來的方法,是python中有特殊語義的方法,也叫魔術方法,注意自定義方法時不要用這個格式命名。魔術方法不需要手動調用,在指定的條件下會自動觸發,而這個__init__方法是在創建實例對象時就會自動觸發。

 

3.關於self的理解

細心的你是不是發現了?在上面的例子,類里的init方法還有一個參數self,self是什么?有什么作用?

self可以理解為自己,即實例對象本身,哪個實例對象去調用,這個self就指向哪個實例對象,python解釋器會把這個實例對象作為第一個參數傳給self。這樣是不是就能解釋為什么實例屬性只能該實例對象去訪問呢。如果覺得有點繞,多理解幾遍,多敲幾遍吧!

 

四、實例方法


1.實例方法的定義

  • 實例方法直接定義在類中
  • 實例方法的第一個參數為self(這個參數必須要寫)

2.實例方法的訪問

  • 通過實例對象直接調用,該類的實例對象都可以訪問,訪問實例方法時會自動將實例對象本身作為第一個參數傳給self接收
  • 通過類調用實例方法時,要傳遞一個self參數,即傳遞一個實例對象(很少用這種方法)
class Dog:  # 創建一個狗類
    cry = '汪汪汪'  # 類屬性
    leg = '四只腳'  # 類屬性

    def __init__(self, name, age):
        """實例對象初始化方法"""
        self.name = name
        self.age = age

    def skill(self):
        sk1 = '爬樹'  # 這里定義的只是一個方法里的變量,其他方法是無法調用的
        print('技能1:{}'.format(sk1))

    def skill2(self, sk2):
        self.sk2 = sk2  # 接收參數sk2,這里為什么要用self.去接收?因為這樣相當於定義了一個實例屬性,self就是指向實例對象
        print('技能2:{}'.format(self.sk2))

    def skill3(self):
        print('技能3:{}'.format(self.sk2))    # 這里訪問self.sk2就能訪問
        print('技能4:{}'.format(sk1))     # 這里訪問sk1會報錯,找不到


wangcai = Dog(name='旺財', age='4')  # wangcai = Dog('旺財', '4')  這種寫法也可以,順序對應參數即可
dog_name = wangcai.name
dog_age = wangcai.age
print('狗的名字:{}'.format(dog_name))  # 實例屬性只能該實例對象訪問
print('狗的年齡:{}'.format(dog_age))

wangcai.skill()  # 通過實例對象直接調用實例方法
wangcai.skill2('抓老鼠')  # 調用實例方法,該實例方法定義了一個必須參數
wangcai.skill3()

運行結果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
Traceback (most recent call last):
狗的名字:旺財
  File "D:/learn/python18_http_request/exercise/test.py", line 31, in <module>
狗的年齡:4
技能1:爬樹
技能2:抓老鼠
技能3:抓老鼠
    wangcai.skill3()
  File "D:/learn/python18_http_request/exercise/test.py", line 20, in skill3
    print('技能4:{}'.format(sk1))     # 這里訪問sk1會報錯,找不到
NameError: name 'sk1' is not defined

Process finished with exit code 1

下面演示一個通過類訪問實例方法(了解即可):

class Dog:  # 創建一個狗類
    cry = '汪汪汪'  # 類屬性
    leg = '四只腳'  # 類屬性

    def __init__(self, name, age):
        """實例對象初始化方法"""
        self.name = name
        self.age = age

    def skill(self):
        sk1 = '爬樹'  # 這里定義的只是一個方法里的變量,其他方法是無法調用的
        print('技能1:{}'.format(sk1))

    def skill2(self, sk2):
        self.sk2 = sk2  # 接收參數sk2,這里為什么要用self.去接收?因為這樣相當於定義了一個實例屬性
        print('技能2:{}'.format(self.sk2))


wangcai = Dog(name='旺財', age='4')  # wangcai = Dog('旺財', '4')  這種寫法也可以,順序對應參數即可
dog_name = wangcai.name
dog_age = wangcai.age
print('狗的名字:{}'.format(dog_name))  # 實例屬性只能該實例對象訪問
print('狗的年齡:{}'.format(dog_age))

# 通過類調用實例方法:要傳遞一個self參數,即傳遞一個實例對象
Dog.skill(wangcai)  # 傳遞一個實例對象
Dog.skill2(wangcai, '抓老鼠')  # 傳遞完實例對象再傳方法里的必需參數

運行結果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
狗的名字:旺財
狗的年齡:4
技能1:爬樹
技能2:抓老鼠

Process finished with exit code 0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM