2.1.0 Python初識面向對象

點擊跳轉Python筆記總目錄python

1、面向過程:

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

優勢: 極大地下降了寫成學的複雜度,只須要順着執行的步驟,堆疊代碼便可bash

缺點: 一套流水線或者流程就是用來解決一個問題,若是修改代碼就都得改變函數

2、面向對象:上帝的思想

優勢: 解決了程序的擴展性。對某一個對象單獨修改,會馬上反映到整個體系中,如對遊戲中一我的物參數的特徵和技能修改都很容易。post

缺點: 可控性差,沒法向面向過程的程序設計流水線式的能夠很精準的預測問題的處理流程與結果,面向對象的程序一旦開始就由對象之間的交互解決問題,即使是上帝也沒法預測最終結果。因而咱們常常看到一個遊戲人某一參數的修改極有可能致使陰霸的技能出現,一刀砍死3我的,這個遊戲就失去平衡。ui

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

  對象/實例:具體的某一事物spa

  實例化:類到對象的過程(實例=類名(參數1,參數2))設計

4、初始類和對象

類的定義:code

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()  ##調用方法 ,對象名.方法()
複製代碼

對象的兩種做用:查看屬性和調用方法(咋上面的實例化中講到)

5、關於self

self:在實例化時自動將對象/實例自己傳給__init__的第一個參數,你也能夠給它起個別的名字,可是通常正常人都不會這麼作,由於你改了別人就不認識了。

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

class Person:
	def  eat(self):
		##這裏的self必須得寫
		pass
複製代碼

6、特殊的類屬性

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))##判斷對象 是不是類的實例
複製代碼

7、對象的相關知識

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

egg = Person('egon',10,1000)
print(egg.name)
print(egg.aggressivity)
print(egg.life_value)  ##固然,你也能夠引用一個方法,由於方法也是一個屬性。
複製代碼

8、面向對象小結

定義及調用的固定格式

class 類名:
    def __init__(self,參數1,參數2):
        self.對象的屬性1 = 參數1
        self.對象的屬性2 = 參數2

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

9、對象之間的交互

人狗大戰小程序

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的生命值
複製代碼

10、類命名空間與對象,實例的命名空間

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

  • 靜態屬性就是直接在類中定義的變量
  • 動態屬性就是定義在類中的方法
相關文章
相關標籤/搜索