2.1.0 Python初識物件導向

花姐毛毛腿發表於2019-01-21

點選跳轉Python筆記總目錄

一、程式導向:

程式導向的程式設計的核心是過程(流水線式思維),過程即解決問題的步驟,程式導向的設計就好比精心設計好一條流水線,考慮周全什麼時候處理什麼東西。

優點: 極大地降低了寫成學的複雜度,只需要順著執行的步驟,堆疊程式碼即可

缺點: 一套流水線或者流程就是用來解決一個問題,如果修改程式碼就都得改變

二、物件導向:上帝的思想

優點: 解決了程式的擴充套件性。對某一個物件單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物引數的特徵和技能修改都很容易。

缺點: 可控性差,無法向程式導向的程式設計流水線式的可以很精準的預測問題的處理流程與結果,物件導向的程式一旦開始就由物件之間的互動解決問題,即便是上帝也無法預測最終結果。於是我們經常看到一個遊戲人某一引數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個遊戲就失去平衡。

三、類:是具有相同特徵的一類事物(人,狗,老虎)

  物件/例項:具體的某一事物

  例項化:類到物件的過程(例項=類名(引數1,引數2))

四、初始類和物件

類的定義:

class  Person:   ##class  類名:
	##注意類名後面不要括號 
	類體
複製程式碼

在python中,用變數表示特徵,用函式表示技能,因而具有相同的特徵和技能的一類事物就是‘類’, 物件則是這一類事物中具體的一個 類的兩種作用: 屬性引用和例項化 屬性引用:

class Person:
    role = '中國人'  ##類屬性----靜態屬性
    def walk(self):  ##這裡的函式叫做方法-----動態屬性
        ##注意:self必須寫
        print('person is walking ...')
print(Person.role) ##檢視類屬性
print(Person.walk) ##檢視類方法 , 用類名去呼叫方法名,列印出來的是記憶體地址
複製程式碼

例項化:

class Person:
    role = '中國人'
    def __init__(self,name,sex):
        self.name=name
        self.sex=sex
    def walk(self):
        print('person is walking')

p= Person('腿姐',21) ##例項化:類名(引數1,引數2)  類名()就等於在執行Person.__init__()
print(p.name)  ##直接檢視屬性   物件名.屬性名
print(p) ##返回的是一個物件
p.walk()  ##呼叫方法  ,物件名.方法()
複製程式碼

物件的兩種作用:檢視屬性和呼叫方法(咋上面的例項化中講到)

五、關於self

self:在例項化時自動將物件/例項本身傳給__init__的第一個引數,你也可以給它起個別的名字,但是一般正常人都不會這麼做,因為你改了別人就不認識了。

注意:def init(self): 這句話可以寫也可以不寫,只要有引數參進來的時候就必須得寫

class Person:
	def  eat(self):
		##這裡的self必須得寫
		pass
複製程式碼

六、特殊的類屬性

class Person:
    role = '中國人'
    def __init__(self,name,sex):
        self.name=name
        self.sex=sex
    def walk(self):
        print('person is walking')

p= Person('腿姐',21) ##例項化一個物件
print(Person.__name__,type(Person.__name__)) ##檢視類的名字(這裡的類名是字串型別的)
print(Person.__dict__) ##查出的是一個字典,key為屬性名,value為屬性值
print(Person.__doc__)## 就是把註釋顯示出來
print(dir(Person)) ##檢視類的方法,以列表的形式顯示出來
print(Person.__module__) ##類定義所在的模組
print(Person.__class__)
print(isinstance(p,Person))##判斷物件 是否是類的例項
複製程式碼

七、物件的相關知識

1.物件是關於類而實際存在的一個例子,即例項 2.物件/例項只有一種作用:屬性引用

egg = Person('egon',10,1000)
print(egg.name)
print(egg.aggressivity)
print(egg.life_value)  ##當然,你也可以引用一個方法,因為方法也是一個屬性。
複製程式碼

八、物件導向小結

定義及呼叫的固定格式

class 類名:
    def __init__(self,引數1,引數2):
        self.物件的屬性1 = 引數1
        self.物件的屬性2 = 引數2

    def 方法名(self):
    	pass
    def 方法名2(self):
    	pass
複製程式碼

九、物件之間的互動

人狗大戰小程式

class Person:
    def __init__(self,name,aggr,life_value):
        self.name=name
        self.aggr=aggr
        self.life_value=life_value
    def attack(self,dog): ##人可以攻擊狗
        dog.life_value=dog.life_value-self.aggr
class Dog:
    def __init__(self,name,aggr,life_value):
        self.name = name
        self.aggr = aggr
        self.life_value = life_value

    def attack(self,egg): ##狗也可以攻擊人
        egg.life_value = egg.life_value - self.aggr
egg = Person('egon',250,1000)  ##示例化一個人呢
dog = Dog('樂樂',50,2000)  ##例項化一個狗
print('狗沒攻擊前egon的生命值:',dog.life_value)  ##沒攻擊前egon的生命值
egg.attack(dog)   ##讓egon去攻擊狗樂樂
print('狗攻擊後egon的生命值:',dog.life_value)  ##攻擊後egon的生命值

print('egon沒攻擊前狗的生命值:',egg.life_value)  ##沒攻擊前egon的生命值
dog.attack(egg)   ##讓狗去攻擊egon
print('egon攻擊後狗的生命值:',egg.life_value)  ##攻擊後egon的生命值
複製程式碼

十、類名稱空間與物件,例項的名稱空間

建立一個類就會建立一個類的名稱空間,用來儲存類中定義的所有名字,這些名字成為類的屬性 而類有兩種屬性:靜態屬性和動態屬性

  • 靜態屬性就是直接在類中定義的變數
  • 動態屬性就是定義在類中的方法

相關文章