1. 程式人生 > 程式設計 >詳解python物件之間的互動

詳解python物件之間的互動

先看看一般的類定義如下:

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  #檢視物件的屬性,直接用 物件名.屬性名 即可
物件名.方法名()   #呼叫類中的方法,直接用 物件名.方法名() 即可

物件之間的互動

現在我們已經有一個人類了,通過給人類一些具體的屬性我們就可以拿到一個實實在在的人。
現在我們要再建立一個狗類,狗就不能打人了,只能咬人,所以我們給狗一個bite方法。
有了狗類,我們還要例項化一隻實實在在的狗出來。
然後人和狗就可以打架了。現在我們就來讓他們打一架吧!

class Person: # 定義一個人類
  role = 'person' # 人的角色屬性都是人

  def __init__(self,name,aggressivity,life_value):
    self.name = name # 每一個角色都有自己的暱稱;
    self.aggressivity = aggressivity # 每一個角色都有自己的攻擊力;
    self.life_value = life_value # 每一個角色都有自己的生命值;

  def attack(self,dog):
    # 人可以攻擊狗,這裡的狗也是一個物件。
    # 人攻擊狗,那麼狗的生命值就會根據人的攻擊力而下降
    dog.life_value -= self.aggressivity

class Dog: # 定義一個狗類
  role = 'dog' # 狗的角色屬性都是狗

  def __init__(self,breed,life_value):
    self.name = name # 每一隻狗都有自己的暱稱;
    self.breed = breed # 每一隻狗都有自己的品種;
    self.aggressivity = aggressivity # 每一隻狗都有自己的攻擊力;
    self.life_value = life_value # 每一隻狗都有自己的生命值;

  def bite(self,people):
    # 狗可以咬人,這裡的狗也是一個物件。
    # 狗咬人,那麼人的生命值就會根據狗的攻擊力而下降
    people.life_value -= self.aggressivity

egg = Person('egon',10,1000) #創造了一個實實在在的人eggprint(egg.name)        # 在obj.name會先從obj自己的名稱空間裡找name,找不到則去類中找,類也找不到就找父類...最後都找不到就丟擲異常
ha2 = Dog('二愣子','哈士奇',1000) #創造了一隻實實在在的狗ha2
print(ha2.life_value)     #看看ha2的生命值
egg.attack(ha2)        #egg打了ha2一下
print(ha2.life_value)     #ha2掉了10點血

面向物件的組合用法

組合指的是,在一個類中以另外一個類的物件作為資料屬性,稱為類的組合

class Weapon:
  def prick(self,obj): # 這是該裝備的主動技能,扎死對方
    obj.life_value -= 500 # 假設攻擊力是500

class Person: # 定義一個人類
  role = 'person' # 人的角色屬性都是人

  def __init__(self,name):
    self.name = name # 每一個角色都有自己的暱稱;
    self.weapon = Weapon() # 給角色繫結一個武器;
    
egg = Person('egon')
egg.weapon.prick() 
#egg組合了一個武器的物件,可以直接egg.weapon來使用組合類中的所有方法

圓環是由兩個圓組成的,圓環的面積是外面圓的面積減去內部圓的面積。圓環的周長是內部圓的周長加上外部圓的周長。
這個時候,我們就首先實現一個圓形類,計算一個圓的周長和麵積。然後在"環形類"中組合圓形的例項作為自己的屬性來用

from math import pi

class Circle:
  '''
  定義了一個圓形類;
  提供計算面積(area)和周長(perimeter)的方法
  '''
  def __init__(self,radius):
    self.radius = radius

  def area(self):
     return pi * self.radius * self.radius

  def perimeter(self):
    return 2 * pi *self.radius


circle = Circle(10) #例項化一個圓
area1 = circle.area() #計算圓面積
per1 = circle.perimeter() #計算圓周長
print(area1,per1) #列印圓面積和周長

class Ring:
  '''
  定義了一個圓環類
  提供圓環的面積和周長的方法
  '''
  def __init__(self,radius_outside,radius_inside):
    self.outsid_circle = Circle(radius_outside)
    self.inside_circle = Circle(radius_inside)

  def area(self):
    return self.outsid_circle.area() - self.inside_circle.area()

  def perimeter(self):
    return self.outsid_circle.perimeter() + self.inside_circle.perimeter()


ring = Ring(10,5) #例項化一個環形
print(ring.perimeter()) #計算環形的周長
print(ring.area()) #計算環形的面積

用組合的方式建立了類與組合的類之間的關係,它是一種‘有'的關係,比如教授有生日,教授教python課程

class BirthDate:
  def __init__(self,year,month,day):
    self.year=year
    self.month=month
    self.day=day

class Couse:
  def __init__(self,price,period):
    self.name=name
    self.price=price
    self.period=period

class Teacher:
  def __init__(self,gender,birth,course):
    self.name=name 
    self.gender=gender
    self.birth=birth
    self.course=course
  def teach(self): 
    print('teaching')

p1=Teacher('egon','male',BirthDate('1995','1','27'),Couse('python','28000','4 months')
      ) 

print(p1.birth.year,p1.birth.month,p1.birth.day) 

print(p1.course.name,p1.course.price,p1.course.period)
''' 
執行結果: 
1995 1 27 
python 28000 4 months 
'''

以上就是詳解python物件之間的互動的詳細內容,更多關於python 物件互動的資料請關注我們其它相關文章!