1. 程式人生 > 實用技巧 >面向物件之類與物件

面向物件之類與物件

一、什麼是面向物件程式設計

核心是“物件”二字,物件指的是“特徵與技能”的結合體。
基於該程式設計思想編寫程式,就好比在創造世界,一種 “上帝式” 的思維方式。

優點:可擴充套件性強
缺點:程式設計的複雜度遠高於面向過程

應用場景:需求經常變化的軟體,一般需求的變化都集中在使用者層,網際網路應用,企業內部軟體,遊戲等都是面向物件的程式設計大顯身手的好地方

二、類與物件

類即類別、種類,是面向物件設計最重要的概念。物件是特徵與技能的結合體,而類則是一系列物件相同的特徵與技能的結合體

那麼問題來了,先有的一個個具體存在的物件(比如一個具體存在的人),還是先有的人類這個概念,這個問題需要分兩種情況去看

從兩種角度:

-現實世界中:
先有物件,然後隨著人類文明的發展,人類站在不同的角度總結出了不同的種類,如人類、動物類、植物類等概念。物件是具體存在的,而類只是一種抽象概念。

-在程式中:
務必保證先定義類,再通過“呼叫類,產生物件”。

在程式中,務必保證:先定義(類),後使用(產生物件)
PS:
  1. 在程式中特徵用變數標識,技能用函式標識
  2. 因而類中最常見的無非是:變數和函式的定義

#程式中的類
定義類的命名規範:駝峰體

class BjdxStudent: #類名指向的是類的記憶體地址
    #用變量表示特徵,在類中的特徵 也稱之為 “屬性” attribute
school = 'Bjdx' #用函式表示技能 #注意: 在類內部定義函式,會預設有一個引數self def learn(self): #self此時當做一個形參 print('is learning...') print(BjdxStudent) # <class '__main__.BjdxStudent'> ''' 注意:在定義類的階段會立刻執行類體內的程式碼,然後將產生的名字存放於類的名稱空間中 ''' #檢視類的名稱空間 print(BjdxStudent.__dict__) print(BjdxStudent.__dict__
['school']) print(BjdxStudent.__dict__['learn']) BjdxStudent.__dict__['learn'](123) 類提供一種特殊獲取名字的方式 “類名.名字” 的方式 # print(BjdxStudent.school) #Bjdx print(BjdxStudent.learn) #函式的記憶體地址 呼叫類裡面的函式的時候必須要傳參,如下: BjdxStudent.learn('tank') #此時learn裡面必須要加引數。 #is learning... # BjdxStudent.school = 'beijing' print(BjdxStudent.school) #beijing # del BjdxStudent.school # BjdxStudent.school = 'Bjdx' print(BjdxStudent.school) #bjdx BjdxStudent.bjdx_student = 'BH' #重點 print(BjdxStudent.bjdx_student) #BH print(BjdxStudent.__dict__) #類的名稱空間裡裡面多了 'bjdx_student': 'BH' ''' 注意區別: - 函式的名稱空間: 在呼叫函式時產生,函式呼叫結束後銷燬。 - 類的名稱空間: 在定義階段時產生,會將類中所有的名字,扔進類的名稱空間中。 '''

三、物件的產生

在程式中:必須呼叫類產生物件

類名+() 即呼叫類,產生物件

類的例項化:呼叫類的過程稱之為類的例項化,產生的物件也可以稱之為類的一個例項。

class Student:
    school = 'bjdx'
    def learn(self):
        print(self)  
        print('learning...')

stu1 = Student()
stu2 = Student()
stu3 = Student()
print(stu1)   #<__main__.Student object at 0x0000025C4BC52548>
print(stu2)   #<__main__.Student object at 0x0000025C4BC537C8>
print(stu3)   #<__main__.Student object at 0x0000025C4BC5CE88>

四、物件繫結方法的特殊之處

class BjdxStudent:
    school = 'bjdx'
    
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        
    def learn(self):
        print('%s is learning...' %self.name)
        
stu1 = BjdxStudent('李三胖',18,'male')
stu2 = BjdxStudent('王大炮',20,'male')

print(BjdxStudent.learn)   
print(stu1.learn)
print(stu2.learn)  #三者的記憶體地址都不一樣
>>> function BjdxStudent.learn at 0x0000021CB0AAC9D8>
>>> <bound method BjdxStudent.learn of <__main__.BjdxStudent object at 0x0000021C999D0508>>
>>> <bound method BjdxStudent.learn of <__main__.BjdxStudent object at 0x0000021C999D75C8>>

1.類內部定義的函式,類可以使用,但類來用的時候就是一個普通函式,普通函式有幾個引數,就傳幾個引數
print(BjdxStudent.learn)   
BjdxStudent.learn(123)

2.類內部定義的函式,其實是給物件使用的,而且是繫結給物件用,繫結給不同的物件就是不同的繫結方法。
print(stu1.learn)  #BjdxStudent.learn(stu1)
print(stu2.learn)  #BjdxStudent.learn(stu2)

3.繫結方法的特殊之處在於,誰來呼叫,就會將誰當作第一個引數自動傳入
stu1.learn()  #李三胖 is learning...
stu2.learn()  #王大炮 is learning...

總結:
1.檢視類與物件的名稱空間 類.dict物件.dict

2.類中資料屬性(類中的變數): 類中屬性是給物件共享的,物件引用類中的屬性,指向的都是類中同一個記憶體地址。

3.類中的方法(類中的函式): 類中的方法是給物件使用的。
由不同的物件來呼叫就會將方法繫結給不同的物件, 並且會將物件當做第一個引數傳入。