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

 

posted @ 2019-01-16 16:01  优雅的代码  阅读(397)  评论(0编辑  收藏  举报