python面向對象基礎

面向對象基礎

1、面向對象和麪向過程

  1. 面向過程:
    1. 優勢:複雜問題流程化,進而簡單化
    2. 肯定:可擴展性差
  2. 面向對象:
    1. 優勢:可擴展性高
    2. 缺點:編寫複雜度高於面向過程

2、類與對象

類即類別、種類,是面向對象設計最重要的概念,對象是特徵與技能的結合體,而類則是一系列對象類似的特徵與技能的結合體。app

那麼問題來了,先有的一個個具體存在的對象(好比一個具體存在的人),仍是先有的人類這個概念,這個問題須要分兩種狀況去看。函數

在現實世界中:先有對象,再有類。設計

世界上確定是先出現各類各樣的實際存在的物體,而後隨着人類文明的發展,人類站在不一樣的角度總結出了不一樣的種類,如人類、動物類、植物類等概念。3d

也就說,對象是具體的存在,而類僅僅只是一個概念,並不真實存在。code

在程序中:務必保證先定義類,後產生對象。對象

這與函數的使用是相似的,先定義函數,後調用函數,類也是同樣的,在程序中須要先定義類,後調用類。blog

不同的是,調用函數會執行函數體代碼返回的是函數體執行的結果,而調用類會產生對象,返回的是對象。繼承

  1. 定義類:文檔

    類名() 作的事:實例化產生一個空對象,去調用__init__方法,完成對象的初始化

    class關鍵字 類名:
    pass

    class A:
        pass
  2. 產生對象:
    對象 = 類名()

    class A:
        pass
    
    B=A()
  3. 類:

    1. 獲取類的屬性和方法:類.__dict__

      class A:
          pass
      
      # B=A()
      print(A.__dict__)
      #輸出:
      {'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
    2. 類來調用屬性和方法:

      • 經過dict來取(複雜,不建議使用)

        class A:
            def __init__(self,name,age):
                self.name = name
                self.age = age
            def change_name(self,new_name):
                self.name = new_name
        
        B = A('ocean',18)
        print(A.__dict__)
        print(B.__dict__)
        print(B.name)
        A.__dict__['change_name'](B,"haha")#比較麻煩,須要傳入對象
        print(B.name)
        
        #
        {'__module__': '__main__', '__init__': <function A.__init__ at 0x000001796354B708>, 'change_name': <function A.change_name at 0x000001796354B798>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
        {'name': 'ocean', 'age': 18}
        ocean
        haha
      • 類名.屬性/函數

        class A:
            def __init__(self,name,age):
                self.name = name
                self.age = age
            def change_name(self,new_name):
                self.name = new_name
        
        B = A('ocean',18)
        A.change_name(B,'haha')
        print(B.name)
        print(A.c)
        
        
        
        #
        haha
        你好
  4. 對象:

    1. 對象獲取屬性和方法:對象.__dict__

      class A:
          def __init__(self,name,age):
              self.name = name
              self.age = age
          def change_name(self,new_name):
              self.name = new_name
      
      B = A('ocean',18)
      print(B.__dict__)
      #
      {'name': 'ocean', 'age': 18}
    2. 對象來調用屬性和方法:對象.屬性/方法

      class A:
          def __init__(self,name,age):
              self.name = name
              self.age = age
          def change_name(self,new_name):
              self.name = new_name
      
      B = A('ocean',18)
      print(B.name)
      print(B.age)
      B.change_name('haha')
      print(B.name)
      #
      ocean
      18
      haha

3、產生對象

對象有:數據屬性(變量),方法屬性(方法)

3.1對象賦屬性:

在對象實例化產生對象的時候,在括號內傳入值,會被傳入到__init__中

  1. 方式一:

    加入有一個學生類,給他一個名字

    stu = Student()

    stu.name = 'sb'

    class Student:
        pass
    stu1  = Student()
    stu1.name = 'chen'
    print(stu1.name)
    #
    
    chen
  2. 方式二:經過__init__方法

    class Student:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    stu = Student('ocera','18')
    print(stu.name)
    stu.name = 'dsb'
    print(stu.name)
    #
    ocera
    dsb
  3. 方式三:

    • 在類中定義該方法,方法上寫一些參數

      class Student:
          def __init__(self,name,age):
              self.name = name
              self.age = age
          def change(self,new_name):
              self.name = new_name
      stu = Student('ocera','18')
      print(stu.name)
      stu.change('dsb')
      print(stu.name)
      #
      ocera
      dsb
  4. 方式四:用類添加

    class Student:
        pass
    Student.name = 'st2'
    stu1  = Student()
    
    print(stu1.name)
    #
    st2
  5. 方式五:用函數

    class Student:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    stu = Student('ocera','18')
    print(stu.name)
    def change_name(obj,new_name):
        obj.name = new_name
    change_name(stu,'dsb')
    print(stu.name)
  6. 方式六:用類修改

    class Student:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def study(self):
            print(self.name)
            print('study...')
    
        def chang_name(obj, new_name):
            print('原來的名字是%s' % obj.name)
            obj.name = new_name
            print('修改的名字是%s' % obj.name)
    stu = Student('ocera',18)
    Student.chang_name(stu,'dsb')
    print(stu.name)
    
    
    #
    原來的名字是ocera
    修改的名字是dsb
    dsb

3.2綁定方法:

  • 定義在類的內部
  • 對象來調用,會自動把對象傳送過來,在方法內部就能夠進行修改該對象。
  1. 強調__init__(初始化方法)

    __init__方法
    爲對象初始化本身獨有的特徵

    內部幫咱們作了一些事:當我在實例化產生對象的時候,會自動調用__init__方法,完成對象的初始化

    強調:
    一、該方法內能夠有任意的python代碼
    二、必定不能有返回值

    三、其餘的方法能夠有返回值

    class Student:
        def __init__(self,name,age):
            self.name = name
            self.age =age
        def study(self):
            print(self.name)
            print("study...")
        def chang_name(self,new_name):
            print('原來的名字%s'%self.name)
            self.name = new_name
            print("如今的名字%s"% self.name)
    #類來調用對象的綁定方法(寫在類中的函數,沒加裝飾器,
    # 有幾個參數就須要傳入幾個參數
    #Student.__init__(123,'nick',18),因爲沒有對象,會報錯
    #類實例化產生對象,會自動調用__init__完成初始化操做
    stu = Student('ocera',18)
    #對象的綁定方法的特殊之處,會把對象自己看成第一個參數傳入
    stu.study()
    #
    ocera
    study...
  2. python中類內置的特使屬性

    #python爲類內置的特殊屬性
    類名.__name__# 類的名字(字符串)
    類名.__doc__# 類的文檔字符串
    類名.__base__# 類的第一個父類(在講繼承時會講)
    類名.__bases__# 類全部父類構成的元組(在講繼承時會講)
    類名.__dict__# 類的字典屬性,查找全部的屬性和方法
    類名.__module__# 類定義所在的模塊
    類名.__class__# 實例對應的類(僅新式類中)

3.3屬性的查找順序:

綁定方法,屬性的查找順序

先從對象自身找--->類中找--->報錯

4、一切皆對象

4.1函數也是對象

def test():
    print('xxx')
test.name = 'lqz'
print(test.name)
#
lqz

4.2 一切皆對象

#一切皆對象
ll=[1,2]
#對象來調用
ll.append(5)
#類來調用
list.append(ll,5)

5、小練習

# 人狗大戰
class Dog:
    type_dog = "藏獒"
    def __init__(self,name,aggressivity,hp = 100):
        self.aggressivity = aggressivity
        self.name = name
        self.hp = hp
    def bite(self,target):
        target.hp -= self.aggressivity
        print(
            """
            狗的品種:%s
            狗名:%s
            狗的傷害值:%s
            人受到的傷害:%s
            人剩餘的血量:%s
            """%(self.type_dog,self.name,self.aggressivity,self.aggressivity,target.hp)
        )
class People:
    def __init__(self,name,aggressivity,hp = 100):
        self.aggressivity = aggressivity
        self.name = name
        self.hp =  hp

    def hit(self,target):
        target.hp -= self.aggressivity
        print(
            """
            人名:%s
            人的傷害值:%s
            狗受到的傷害:%s
            狗剩餘的血量:%s
            """ % (self.name, self.aggressivity, self.aggressivity, target.hp)
        )

people1 = People('sb',20)

dog1 = Dog('sg',10,200)
while people1.hp>0 :
    people1.hit(dog1)
    dog1.bite(people1)
print("接下來是對戰小練習,定製英雄,對戰開始")


class Revie:
    def __init__(self, name, arrgressivity=10, life_value=100, money=100, arror=3):
        self.name = name
        self.arrgressivity = arrgressivity
        self.life_value = life_value
        self.money = money
        self.arror = arror

    def atrack(self, enemy):
        enemy.life_value -= (self.arrgressivity - enemy.arror)


class Gewen:
    def __init__(self, name, arrgressivity=10, life_value=100, money=100, arror=3):
        self.name = name
        self.arrgressivity = arrgressivity
        self.life_value = life_value
        self.money = money
        self.arror = arror

    def atrack(self, enemy):
        enemy.life_value -= (self.arrgressivity - enemy.arror)


class Weapon:
    def __init__(self, price=10, life_value=100, arror=10, arrgv=100):
        self.price = price
        self.arror = arror
        self.life_value = life_value
        self.arrgv = arrgv

    def update(self, obj):
        obj.money -= self.price
        obj.life_value += self.life_value
        obj.arrgressivity += self.arrgv
        obj.arror+=self.arror
    def fire(self, obj):
        obj.life_value -= 50


p1 = Revie('潤文')
p2 = Gewen("蓋文")
arm = Weapon()

if p1.money > arm.price:
    p1.arm = arm
    arm.update(p1)

print(p1.money,p1.life_value,p1.arrgressivity,p1.arror)
print(p2.money,p2.life_value,p2.arrgressivity,p2.arror)

while p1.life_value>0 and p2.life_value>0:
    p1.atrack(p2)
    print("""
    姓名:%s
    餘額:%s
    生命值:%s
    攻擊力:%s
    護甲:%s
    
    """%(p2.name,p2.money, p2.life_value, p2.arrgressivity, p2.arror))
    p2.atrack(p1)

    print("""
      姓名:%s
      餘額:%s
      生命值:%s
      攻擊力:%s
      護甲:%s

      """ % (p1.name, p1.money, p1.life_value, p1.arrgressivity, p1.arror))
    p1.arm.fire(p2)
    print("""
      姓名:%s
      餘額:%s
      生命值:%s
      攻擊力:%s
      護甲:%s

      """ % (p2.name, p2.money, p2.life_value, p2.arrgressivity, p2.arror))
    p2.atrack(p1)

    print("""
      姓名:%s
      餘額:%s
      生命值:%s
      攻擊力:%s
      護甲:%s

      """ % (p1.name, p1.money, p1.life_value, p1.arrgressivity, p1.arror))
相關文章
相關標籤/搜索