1. 程式人生 > 實用技巧 >十二、python類和物件

十二、python類和物件

一、概念

類calss:人以群分,物以類聚。種類/分類 具備相同特徵或者行為的一個群體,模型(造物件) 物件object:又被稱為例項 instance ,是一個群裡當中的成員/個體。模型造出來的具體的東西 二、類和物件在Python中表示 1)類的定義 class 類名: 類的組成部分
class Man:
        pass

class Man():       #()加不加都可以
        pass

class Man(object):
    pass

# 以上三個表示相同的類

2)類的呼叫

class Man:
    pass

new_man=Man
print(new_man) #結果:<class '__main__.Man'> print(Man) #結果:<class '__main__.Man'> '''物件的表示方法:類名()''' print(Man()) #結果:<__main__.Man object at 0x1016c84e0>

注意:例項化兩個物件,他們兩個不相等,記憶體地址不一樣

class Man:
    pass

a=Man()
b=Man()
print(a)         # <__main__.Man object at 0x00000212A43D9460>
print(b) # <__main__.Man object at 0x00000212A43B76A0> print(a is b) # False
# 經典的面試題
print(Man() is Man())   # False

# 如何進一步確定是不是同一個物件
print(id(a))
print(id(b))

三、類的命名

類的命名:大駝峰命名,兩個單詞的首字母大寫(首字母大寫)class PerfectManHelp

函式的命名:下劃線命名,兩個單詞之間用下劃線隔開 perfect_man_help

變數命名:下劃線命名,perfect_man_help

注意:一個物件可能屬於多個類

class Cat:
    pass

jiafei = Cat()
tom = Cat()
blue = Cat()
print(jiafei) print(tom) print(blue) ''' <__main__.Cat object at 0x000002563CD49460> <__main__.Cat object at 0x000002563CD276A0> <__main__.Cat object at 0x000002563CD576D0> '''

四、屬性

什麼是屬性?表示類、物件的特徵。特徵是別人不具備的.

1)類屬性/例項屬性區別一:

類屬性:這個類的特徵,這個群體的版本特徵,別的類可能不具備,所有的成員都是一樣的

例項屬性:個體的特徵(不是每個成員都一樣),類當中的其他成員可能不具備

類屬性的獲取:類名.屬性 可以先天定義,也可以手工新增

class Man:
    # 定義類屬性
    gender = ''
    power = ''

print(Man.gender)  # 男  Man類的gender屬性
print(Man.power)   # 強 Man類的power屬性
# 手工新增
Man.hello = 'helle python'
print(Man.hello)   # helle python

# 例項屬性的手工新增
Leilei = Man()
Leilei.handsome = 'yes'
print(Leilei.handsome)    # yes
ShiTou = Man()
print(ShiTou.handsome)   # ShiTou沒有定義handsome,這是錯誤的

2)類屬性/例項屬性區別二

類屬性,可以被例項、物件訪問

示例屬性,不可以被類獲取

類可以訪問例項屬性嗎?Man.name 不可以

例項可以訪問類屬性嗎?可以

class Man:
    #定義類屬性
    power = 'strong'
    gender = ''
    
Lei= Man()

Lei.eye = 'big'  #eye是Lei這個例項的屬性
print(polo.eye)

print(Man.eye)#類不能獲取例項屬性

2)初始化

要通過定義的類得到一個具體的物件。生出一個物件

物件個體,初始化過程保證生出來是不一樣的

_ _init_ _(self) :在這裡設定先天的屬性

注意:self: 在類裡面,表示一個物件它自己

先天設定的例項屬性:self.屬性 = 引數

語法:def_ _init_ _ (self,name):

      self.name = name

class Man:
    #定義類屬性
    power = 'strong'
    gender = ''

    def __init__(self,face_shape,name):
        #物件的例項化過程
        #定義在類裡面,定義例項屬性用self.屬性 = 引數
        self.face = face_shape
        self.name  = name
Lei= Man('圓臉','polo')
print(Lei.face,Lei.name)

先天設定好例項屬性,可以後天修改

class Man:
    #定義類屬性
    power = 'strong'
    gender = ''

    def __init__(self,name,face_shape = '圓臉'): #預設引數要放在位置引數的後面
        #物件的例項化過
        #定義在類裡面,定義例項屬性用self.屬性 = 引數
        self.face = face_shape
        self.name  = name
Lei= Man('Lei','方臉')
print(Lei.face)
Lei.face = '瓜子臉'
print(polo.face)
'''
方臉
瓜子臉
'''

__init__ (self) 總結:

必須return None(不寫就是return None,寫一個return,也會返回None。return 其他值會報錯)

傳入的引數必須設定為例項屬性,才能被物件訪問到

例項方法中的self呼叫__init__ 的例項屬性

class Man:
    #定義類屬性
    power = 'strong'
    gender = ''

    def __init__(self,name,face_shape ):
        self.face = face_shape
        self.name  = name

    def drink(self,brand):
        print('{}正在喝{}酒'.format(self.name,brand))#如果沒有self,就沒法呼叫name

polo = Man('polo','方臉')
print(polo.drink('茅臺'))
'''
polo正在喝茅臺酒
None
'''

一個例項方法可以呼叫別的例項方法,也可以呼叫類方法

class Man:
    #定義類屬性
    power = 'strong'
    gender = ''

    @classmethod
    def eat(cls):
        print('在吃東西')

    def __init__(self,name,face_shape ):
        self.face = face_shape
        self.name  = name

    def drink(self,brand):
        print('{}正在喝{}酒'.format(self.name,brand))#如果沒有self,就沒法呼叫name
        self.play_game() #play_game()在後面也會正常呼叫到
        self.eat()#例項方法可以呼叫類方法

    def play_game(self):
        print('在玩遊戲')

polo = Man('polo','方臉')

print(polo.drink('茅臺'))
'''
polo正在喝茅臺酒
在玩遊戲
在吃東西
None
'''

五、方法

方法:表示類、物件的行為,本質上是函式

屬性名稱:名詞

方法:動詞

方法 VS 函式:

1.方法裡有self

2.方法放在類裡面,縮排的

3.呼叫過程不一樣,方法需要加字首,類名或者物件名,函式要麼不加,要麼加模組名

class Man:
    # 定義類屬性
    gender = ''
    power = ''
    def drink(self):
        '''喝飲料'''
        pass
    def play_game(self):
        '''玩遊戲'''
        pass
# 物件.方法()
Man().drink()
Lei= Man()
Lei.drink()
# 行為是屬於某一個人的,不能被類呼叫
# 不OK,Man.drink()                

例項方法,物件方法:

1.第一個引數名稱必須是self,

2.例項方法在呼叫時字首是物件,不能是類(如物件Man( ),類是Man)

類方法:

1.在方法的上面新增裝飾器@classmethod

2.把例項方法中的self改成cls

class Man:
    #定義類屬性
    power = 'strong'
    gender = ''

    @classmethod      #@表示裝飾器 decorator
    def eatfood(cls):  #cls就是class的縮寫
        print('在吃東西')

print(Man.eatfood())
'''
在吃東西
None # 類方法沒有return,返回值是none,print會列印方法的返回值
'''

靜態方法: 表示:在方法上面新增@staticmethod 不需要用self、cls作為固定引數,可以傳參 是剛剛好放在一個類當中的普通函式而已,除了放在類中,和普通函式沒什麼區別 沒有實際作用,和類或物件沒有關係 為什麼要用靜態方法?為什麼要把普通的函式放在類當中去?----》方便管理 靜態方法呼叫:在靜態方法前加類或物件名
class Man:
    #定義類屬性
    power = 'strong'
    gender = ''

    @staticmethod
    def hello(): #沒有固定引數self
        print('在學習python')

print(Man.hello())
print(Man().hello())
'''
在學習python
None
在學習python
None

'''

六、總結

1、例項屬性和類屬性的區別;

例項可以獲取例項屬性和類屬性

類只能獲取類屬性

例項屬性寫到__init__裡面

2、方法

例項方法:例項具備的,類不一定具備。類不能呼叫例項方法

類方法"類具備的,例項可以獲取

靜態方法:放在類裡面的函式

3、__init__

表示物件的初始化過程,通常在裡面定義例項屬性

實力屬性的值通過引數傳遞進來

引數必須賦值給例項屬性,self.屬性 = 引數

4、self/cls

self:在類裡面,表示一個物件他自己,自我 (有的語言使用this) cls:在類裡面,表示一個類他自己