面向對象編程

面向對象

一、什麼是面向對象

面向對象是一門編程思想python

面向過程編程思想:

  • 核心是 「過程」 二字,過程指的是解決問題的步驟,即先幹什麼再幹什麼!基於該編程思想編寫程序,就比如在設計一條工廠流水線,一種機械式的思惟方式。
  • 優勢: 將複雜的問題流程化,進而簡單化
  • 缺點: 牽一髮而動全身,程序的可擴展性差

面向對象編程思想:

  • 核心是「對象」二字,對象是 「特徵與技能」 的結合體,基於該編程思想編寫程序就比如上帝在創造萬物,一種上帝式的思惟方式。
  • 優勢:可擴展性高
  • 缺點:編寫程序時複雜程度比面向過程編程高

二、如何產生對象

一、什麼是類

類指的是類型,一系列對象之間相同的特徵與技能的結合體編程

在現實世界中,先有對象再定義出類,類是抽象產生的,對象是實際存在的函數

在程序中,必須先定義類,而後再調用類獲得返回值獲得對象學習

二、如何定義類

先從現實世界中經過對象來總結出類,而後再定義類,經過調用類來產生對象大數據

語法:class + 類的名字:(類名要是駝峯體)設計

​ 對象之間相同的特徵(數據屬性,變量)code

​ 對象之間相同的技能(類中的方法,函數)對象

三、類的實例化

調用類的過程稱爲類的實例化,產生的對象也能夠稱爲類的一個實例內存

調用類產生對象時發生的事情:it

  • 產生一個空的對象的名稱空間
  • 會自動觸發類中的__ init__() , 並將對象當作第一個參數傳入
  • 會將調用類括號內的參數,一併傳入__ init__()中
# 定義一個People類名,注意使用駝峯體
class People:
    country = '中國'

    def __init__(self,name,age,sex):
        # 給對象添加新屬性
        self.age = age
        self.name = name
        self.sex = sex

    #類裏面定義函數默認會傳入一個self當形參
    def learn(self):
        print('學習技能')

p1 = People('shen', 18, 'male')
print(p1.name) # shen
print(p1.age) # 18
print(p1.sex) # male
#直接經過類來調用類中的函數須要傳入任意一個參數給self
People.learn(111)
#經過對象來調用類中的函數,不須要傳入參數,由於對象會被當作參數傳入
p1.learn()

四、查看類與對象的名稱空間 類.__ dict __ 對象.__ dict__

經過類.__ dict __ 或 對象.__ dict__ 查看類與對象的名稱空間,也能夠經過.__ dict __['類或對象中的名字']直接查看值

# # 定義一個People類名,注意使用駝峯體
class People:
    country = '中國'

    def __init__(self,name,age,sex):
        self.age = age
        self.name = name
        self.sex = sex

    #類裏面定義函數默認會傳入一個self當形參
    def learn(self):
        print('學習技能')

p1 = People('shen', 18, 'male')
print(p1.__dict__) # {'age': 18, 'name': 'shen', 'sex': 'male'}
print(p1.__dict__['age']) # 18
print(People.__dict__) # {'__module__': '__main__', 'country': '中國', '__init__': <function People.__init__ at 0x000002CCD9AC2B88>, 'learn': <function People.learn at 0x000002CCD9AC6DC8>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
print(People.__dict__['country']) # 中國
print(People.__dict__['learn']) # <function People.learn at 0x0000015CFB1A6DC8>

五、類或對象的屬性操做:增、刪、改、查

class People:
    country = '中國'

    def __init__(self,name,age,sex):
        self.age = age
        self.name = name
        self.sex = sex

    #類裏面定義函數默認會傳入一個self當形參
    def learn(self):
        print('學習技能')

p1 = People('shen', 18, 'male')
# 查
print(p1.country) # 中國
# 改
p1.country = 'China'
print(p1.country) # China
# 刪
del p1.sex
print(p1.sex) # 刪除後報錯
# 增
People.salary = 150000000000
print(People.salary) # 150000000000
print(p1.salary)# 150000000000

六、類中的數據屬性(類中的變量):類中的數據屬性是全部對象共享的,對象引用類中的屬性,指向的都是類中同一個內存地址

七、類中的方法(函數):類中的方法(函數屬性)是綁定給對象使用的,由不一樣的對象來調用,傳入函數中的self不一樣,內存地址都不同

p1 = People('shen', 18, 'male')
p2 = People('shen1', 19, 'male')
p3 = People('shen2', 20, 'male')
print(p1.country, id(p1.country)) # 中國 1853896576144
print(p2.country, id(p2.country)) # 中國 1853896576144
print(p3.country, id(p3.country)) # 中國 1853896576144

調用類中的方法,id相同,只是傳入的對象給self不一樣因此方法不一樣
print(People.learn, id(People.learn)) # <function People.learn at 0x000002A39FF26DC8> 2901786389960
print(p1.learn, id(p1.learn)) #<bound method People.learn of <__main__.People object at 0x00000153E75690C8>> 1459724834120
print(p2.learn, id(p2.learn)) #<bound method People.learn of <__main__.People object at 0x00000153E73BF708>> 1459724834120
print(p3.learn, id(p3.learn)) #<bound method People.learn of <__main__.People object at 0x00000153E73BF588>> 1459724834120

八、對象的綁定方法

由對象來調用類裏面的函數稱爲對象的綁定方法

對象的綁定方法的特殊之處:

  • 會將對象當作一個參數傳入
  • 若對象的綁定方法還有其餘參數,會一併傳入

九、對象屬性的查找順序

對象.屬性:先從對象自身的名稱空間中查找——》類的名稱空間中查找——》再找不到會報錯

十、python中一切皆對象

用type方法打印出有 都是類,調用即產生對象,八大數據類型皆是類,定義時自動調用類產生對象,等等

str1 = '沈'
print(type(str1))  # <class 'str'>
list1 = [1, 2, 3]
print(type(list1))  # <class 'list'>
相關文章
相關標籤/搜索