2018年12月5日 星期三

python - 初次認識面向對向

#初識面向對向
dict
d =  {'k':'v'}

list
[1,2]
print(dict) 類
print(d)      對象


自訂義類
def  函數名():
            pass




class 類名:
           屬性  =  'a'

print(類名.屬性)
類名的作用   就是操作屬性    查看屬性


class  Person:              #類名    country =  'China'      #創造了一個只要是這個類就一定有的屬性                            #類屬性  靜態屬性    def  __init__(self,*args):  #初始化方法,self是對象,是一個必須傳的參數        #self 就是一個可以儲存很多屬性的大字典        self.name  = args[0]     #往字典裡添加屬性的方式發生了一些變化        self.hp = args[1]
        self.aggr = args[2]
        self.sex = args[3]

    def walk(self,n):       #方法,一般情況下必須傳self參數,且必須寫在第一個                            #後面還可以傳其他參數,是自由的        print('%s走走走,走了%s步'%(self.name,n))


print(Person.country)       #類名  可以查看類中的屬性,不需要實例化就可以查看alex = Person('狗盛兒',100,1,'不詳') #類名還可以實例化對象,alex 對象 #實例化print(alex.__dict__)        #查看所有屬性print(alex.name)            #查看屬性值print(alex.hp)              #查看屬性值alex.walk(5)                #Person.walk(alex,5) #調用方法  類名.方法名(對象名)

print(Person.__dict__['country'])
Person.__dict__['country'] = '印度'print(alex.__dict__['name'])
alex.__dict__['name'] = '大哥'print(alex.__dict__)
print(alex.name)
print(alex.name)
alex.name = '大哥'alex.__dict__['name'] = '大哥'alex.age = 83print(alex.__dict__)
print(alex.name)


對象  =  類名( )
過程:
      類名( )  首先會創造出一個對象,創建了一個self變量
      調用init方法,類名跨號裡的參數會被這裡接收
      執行init方法
      返回self
對象能做的事:
      查看屬性
      調用方法
      __ditc__對於對象的增刪改查操作都可以通過字典的語法進行
類名能做的事:
     實例化
     調用方法:  只不過要自己傳遞self 參數
     調用類型的屬性,也就是調用靜態屬性
     __dict__對於類中的名子只能看 不能操作
 

#面向對向的引入
#人狗大戰def Dog(name,blood,aggr,kind):
    dog = {
        'name':name,        'blood': blood, #血量        'aggr': aggr,   #攻擊力        'kind': kind
    }
    def bite(person):
        person['blood'] -= dog['aggr']
        print('%s被咬了,掉了%s的血'%(person['name'],dog['aggr']))
    dog['bite'] = bite
    return  dog

def person(name,blood,aggr,sex):
    person={
        'name': name,        'blood': blood,  # 血量        'aggr': aggr,  # 攻擊力        'sex': sex
    }
    def attack(dog):
        dog['blood'] -=person ['aggr']
        print('%s被打了,掉了%s的血'%(dog['name'],person['aggr']))
    person['attack'] =  attack
    return  person

#代碼精簡了  方便增加人物  方便修改  人物更加規範  - 人模子

jin = Dog('金老闆',1000,100,'teddy')
alex = person('狗剩兒',100,1,'不詳')
nezha = person('哪吒',200,2,'不詳')

print(jin)
jin['bite'] (alex)
alex['attack'](jin)
#Dog函數和person函數  都是定義了一類事物#直到調用了函數,賦直了之後才真的有了一個實實在在的人或狗
#面向對向編成#所謂模子  就是 類抽象的 我能知道有甚麼屬性  
#有甚麼技能  但不能知道屬性具體的值#jin alex nezha 舊式對象 有具體的值,屬性和技能都是根據類規範的
執行結果:
{'name': '金老闆', 'blood': 1000, 'aggr': 100, 'kind': 'teddy', 'bite': <function Dog.<locals>.bite at 0x010EB8E8>}
狗剩兒被咬了,掉了100的血
金老闆被打了,掉了1的血



#面想對象的交互
class  Dog:
    def __init__(self,name,blood,aggr,kind):
        self.name = name
        self.hp = blood
        self.aggr = aggr
        self.kind = kind
    def bite(self,person):
        #狗咬人,人掉血        person.blood  -= self.aggr

class Person :
    def __init__(self,name,blood,aggr,sex):
        self.name = name
        self.blood = blood
        self.aggr = aggr
        self.sex = sex

    def attack(self,dog):
        dog.hp -= self.aggr
        if dog.hp <= 0 :
            print('%s打了%s,%s被打死了,撲接~~~'%(self.name,
dog.name,dog.name))
        else:
            print('%s打了%s,掉了%s血'%(self.name,dog.name,
self.aggr))

jin = Dog('金老闆',100,20,'teddy')
alex = Person('alex',999,998,'不詳')
jin.bite(alex)
print(alex.blood)
alex.attack(jin)
print(jin.hp)


執行結果:
979
alex打了金老闆,金老闆被打死了,撲接~~~
-898


#練習

練習一 : 顯示如下的訊息

小明,10歲,男,上山去砍柴
小明,10歲,男,開車去樂園
小明,10歲,男,最愛喝可樂

老李,90歲,男,上山去砍柴
老李,90歲,男,開車去樂園
老李,90歲,男,最愛喝可樂

老張.........

例:

def shangshan():
    print('%s,%s歲,%s,上山去砍柴')
def drive():
    print('%s,%s歲,%s,開車去樂園')
def favor():
    print('%s,%s歲,%s,最愛喝可樂')

shangshan('小明','10','男')
drive('小明','10','男')
favor('小明','10','男')


#非常明顯的處理一類事物,這些事物都具有相似的屬性和功能#當有幾個函數  需要反反復復傳入相同的參數的時候,就可以考慮面向對象#這些參數都是對象的屬性
class Person:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def shangshan(self):
        print('%s,%s歲,%s,上山去砍柴'%(self.name,self.age,self.sex))
    def drive(self):
        print('%s,%s歲,%s,開車去樂園'%(self.name,self.age,self.sex))
    def favor(self):
        print('%s,%s歲,%s,最愛喝可樂'%(self.name,self.age,self.sex))

ming = Person('小明','10','男')
ming.shangshan()
ming.drive()
ming.favor()
zhang = Person('老張','90','男')
zhang.shangshan()
zhang.drive()
zhang.favor()

執行結果:
小明,10歲,男,上山去砍柴
小明,10歲,男,開車去樂園
小明,10歲,男,最愛喝可樂
老張,90歲,男,上山去砍柴
老張,90歲,男,開車去樂園
老張,90歲,男,最愛喝可樂




練習二 : 求結果
circle 屬性 半徑,兩個方法:求周長和面積
#2pir  pir**2from math import pi
class Circle:
    def __init__(self,r):
        self.r = r
    def area(self):
        return pi*(self.r**2)
    def perimeter(self):
        return  2*pi*self.r

c1 = Circle(6)
print(c1.area())
print(c1.perimeter())
執行結果:
113.09733552923255
37.69911184307752


定義類
init方法
self是甚麼 self擁有屬性都屬於對象
類中可以定義靜態屬性
類中可以定義方法,方法都有一個必須傳的參數self
實例化
實例、對象
對象查看屬性
對象調用方法

正方形 周長和面積

































沒有留言:

張貼留言