python-32: 面向對象設計(object oriented design,OOD)

#面向對象設計引出
dog1={          #定義一條狗的數據屬性,以字典類型保存--->至關於對象的數據屬性,在對象__dict__字典裏,對象__dict__字典只包含數據屬性
    'name':'hly',
    'gender':'',
    'type':'京巴'
}
def bark(dog):  #定義方法屬性---->至關於類的方法屬性,在類的__dict__字典裏,類的__dict__字典,包含類的數據屬性和方法屬性
    print('一條名叫%s狗正在叫。。。'%dog['name'])
def bite(dog):
    print('一條%s狗正在咬人。。。'%dog['type'])
person1={        #定義人的屬性
    'name':'小明',
    'gender':''
}
bite(dog1)
bark(person1)#一條名叫小明狗正在叫。。。--->若是這樣,人也能調用狗的方法了,問題關鍵是:狗沒有將狗的方法綁定,沒有將屬性和方法綁定在一塊兒

#方法一:很是low=============================================================================================
dog1.update({'shuxing':'dog'})#給狗的字典加一個屬性,shuxing=dog
def bark(dog): #重構狗的每一個方法,加判斷
    if dog.get('shuxing')=='dog':   #dog.get(key),key不存在時,返回none,
        print('一條%s狗正在咬人。。。'%dog['type'])
    else:
        print('這不是狗,沒有狗的屬性')
bark(person1)
bark(dog1)

#方法二:方法和對象綁定死了,不行============================================================================
def dog():
    def bark(dog):  #定義方法屬性---->至關於類的方法屬性,在類的__dict__字典裏,類的__dict__字典,包含類的數據屬性和方法屬性
        print('一條名叫%s狗正在叫。。。'%dog['name'])
    def bite(dog):
        print('一條%s狗正在咬人。。。'%dog['type'])

    dog2={          #定義一條狗的數據屬性,以字典類型保存--->至關於對象的數據屬性,在對象__dict__字典裏,對象__dict__字典只包含數據屬性
        'name':'hly',
        'gender':'',
        'type':'京巴',
        'bark':bark, #函數名也是變量,這樣屬性和方法就綁定在一個字典裏了
        'bite':bite
    }
    return dog2   #返回字典
d=dog()#返回dog2的字典
print(d)#{'name': 'hly', 'gender': '公', 'type': '京巴', 'bark': <function dog.<locals>.bark at 0x01CAE8E8>, 'bite': <function dog.<locals>.bite at 0x01CAE8A0>}
d['bark'](d)#執行'bark'方法,但只能運行一條狗的方法,這樣綁定死了,不是動態綁定

#方法三:動態綁定============================================================================
def dog(name,gender,type):
    def bark(dog):  #定義方法屬性---->至關於類的方法屬性,在類的__dict__字典裏,類的__dict__字典,包含類的數據屬性和方法屬性
        print('一條名叫%s的狗正在汪汪叫。。。'%dog['name'])
    def bite(dog):
        print('一條%s狗正在咬人。。。'%dog['type'])

    dog2={          #定義一條狗的數據屬性,以字典類型保存--->至關於對象的數據屬性,在對象__dict__字典裏,對象__dict__字典只包含數據屬性
        'name':name,
        'gender':gender,
        'type':type,
        'bark':bark, #函數名也是變量,這樣屬性和方法就綁定在一個字典裏了
        'bite':bite
    }
    return dog2   #返回字典
d1=dog('小豬','','哈巴')#返回dog2的字典
d2=dog('小貓','','狗屁')
d1['bark'](d1)#執行'bark'方法,動態綁定
d2['bite'](d2)#執行'bite'方法,動態綁定

#方法四:優化代碼,使邏輯明瞭====================================================
def dog(name,gender,type):
    def bark(dog):  #定義方法屬性---->至關於類的方法屬性,在類的__dict__字典裏,類的__dict__字典,包含類的數據屬性和方法屬性
        print('一條名叫%s的狗正在汪汪叫。。。'%dog['name'])
    def bite(dog):
        print('一條%s狗正在咬人。。。'%dog['type'])
    def init(name,gender,type):
        dog2={          #定義一條狗的數據屬性,以字典類型保存--->至關於對象的數據屬性,在對象__dict__字典裏,對象__dict__字典只包含數據屬性
            'name':name,
            'gender':gender,
            'type':type,
            'bark':bark, #函數名也是變量,這樣屬性和方法就綁定在一個字典裏了
            'bite':bite
        }
        return dog2
    res=init(name,gender,type)
    return res   #返回字典


#################################################################################################################
# 至此,面向對象編程基本引出:類和對象
#    類:就是數據屬性和方法屬性的集合。
#    對象:只包含自身的數據屬性,具備類的方法,初始化時就建立了一個對象。
View Code
相關文章
相關標籤/搜索