1. 程式人生 > >Python之初始面向對象(3--5)

Python之初始面向對象(3--5)

修改 面向 import agg 引用 結果 打了 人物 元組

面向過程 VS 面向對象 :

面向過程的優缺點:

優點是:極大的降低了寫程序的復雜度,只需要

順著要執行的步驟,堆疊代碼即可。

缺點是:一套流水線或者流程就是用來解決一個問題,代碼牽一發而動全身

面向對象的優缺點:

優點是:解決了程序的擴展性。對某一個對象單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物參數的特征和技能修改都很容易。

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

類有兩種作用:屬性引用和實例化

屬性引用(類名.屬性)

class Person:   #定義一個人類
    role = person  #人的角色屬性都是人
    def walk(self):  #人都可以走路,也就是有一個走路方法
        print("person is walking...")


print(Person.role)  #查看人的role屬性
print(Person.walk)  #引用人的走路方法,註意,這裏不是在調用

實例化:類名加括號就是實例化,會自動觸發__init__函數的運行,可以用它來為每個實例定制自己的特征

class Person:   #
定義一個人類 role = person #人的角色屬性都是人 def __init__(self,name): self.name = name # 每一個角色都有自己的昵稱; def walk(self): #人都可以走路,也就是有一個走路方法 print("person is walking...") print(Person.role) #查看人的role屬性 print(Person.walk) #引用人的走路方法,註意,這裏不是在調用

實例化的過程就是類——>對象的過程

原本我們只有一個Person類,在這個過程中,產生了一個egg對象,有自己具體的名字、攻擊力和生命值。

語法:對象名 = 類名(參數)

egg = Person(‘egon‘)  #類名()就等於在執行Person.__init__()
#執行完__init__()就會返回一個對象。這個對象類似一個字典,存著屬於這個人本身的一些屬性和方法。
#你可以偷偷的理解:egg = {‘name‘:‘egon‘,‘walk‘:walk}

查看屬性&調用方法

print(egg.name)     #查看屬性直接 對象名.屬性名
print(egg.walk())   #調用方法,對象名.方法名()

類屬性的補充

一:我們定義的類的屬性到底存到哪裏了?有兩種方式查看
dir(類名):查出的是一個名字列表
類名.__dict__:查出的是一個字典,key為屬性名,value為屬性值

二:特殊的類屬性
類名.__name__# 類的名字(字符串)
類名.__doc__# 類的文檔字符串
類名.__base__# 類的第一個父類(在講繼承時會講)
類名.__bases__# 類所有父類構成的元組(在講繼承時會講)
類名.__dict__# 類的字典屬性!!!
類名.__module__# 類定義所在的模塊
類名.__class__# 實例對應的類(僅新式類中)

用函數來解釋類:

技術分享圖片
def Person(*args,**kwargs):
    self = {}
    def attack(self,dog):
        dog[life_value] -= self[aggressivity]

    def __init__(name,aggressivity,life_value):
        self[name] = name
        self[aggressivity] = aggressivity
        self[life_value] = life_value
        self[attack] = attack

    __init__(*args,**kwargs)
    return self

egg = Person(egon,78,10)
print(egg[name])
用函數解釋類

面向對象小結——定義及調用的固定模式:

技術分享圖片
class 類名:
    def __init__(self,參數1,參數2):
        self.對象的屬性1 = 參數1
        self.對象的屬性2 = 參數2

    def 方法名(self):pass

    def 方法名2(self):pass

對象名 = 類名(1,2)  #對象就是實例,代表一個具體的東西
                  #類名() : 類名+括號就是實例化一個類,相當於調用了__init__方法
                  #括號裏傳參數,參數不需要傳self,其他與init中的形參一一對應
                  #結果返回一個對象
對象名.對象的屬性1   #查看對象的屬性,直接用 對象名.屬性名 即可
對象名.方法名()     #調用類中的方法,直接用 對象名.方法名() 即可
面向對象的固定模式

用面向對象來表示一個圓的面積和周長:

技術分享圖片
from math import pi

class Circle:
    ‘‘‘
    定義了一個圓形類;
    提供計算面積(area)和周長(perimeter)的方法
    ‘‘‘
from math import pi
class Circle:
    def __init__(self,r):
        self.r=r
    def area(self):
        return pi*self.r**2
    def girth(self):
        return 2*pi*self.r
r=Circle(3)#實例化一個圓
print(r.area())#打印圓面積
print(r.girth())#打印圓的周長
圓的面積和周長 技術分享圖片
#人狗大戰:
# class Person:
#     def __init__(self,name,sex,hp,agger):
#         self.name=name
#         self.sex=sex
#         self.hp=hp
#         self.agger=agger
#     def hit(self,dog):
#         print(‘%s打了%s‘%(self.name,dog.name))
#         dog.hp-=self.agger
# class Dog:
#     def __init__(self,name,kind,hp,agger):
#         self.name=name
#         self.kind=kind
#         self.hp=hp
#         self.agger=agger
#     def bite(self,person):
#         print(‘%s咬了%s‘%(self.name,person.name))
#         person.hp-=self.agger
# hei = Dog(‘小黑‘,‘teddy‘,260,10000)
# obj=Person(‘yimi‘,‘girl‘,10,500)
# obj.hit(hei)
# hei.bite(obj)
人狗大戰遊戲

Python之初始面向對象(3--5)