day26

2018-04-16  本文已影响14人  两分与桥

python 面向对象的多态性,可以多种形态去执行,基础是基类

#python 内置的函数中,len() 等同于 object.__len__()

l = 'bbs'
len(l)
l.__len__()

输出结果:
3
3

自定义函数实现

class test:
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def run(self):
        print('name is %s, gender is %s' %(self.name, self.gender))

def run_fun(obj):
    obj.run()

t = test('libai', 'none')
t.run()
run_fun(t)

输出结果:
name is libai, gender is none
name is libai, gender is none

用字典的方式调用函数

def Add(x,y):
    return x+y
def Multiply(x,y):
    return (x*y)
def check(x):
    try:
        int(x)
        return True
    except:
        return False

#用字典的方式调用函数
mute = {
    1:Add,
    2:Multiply
}
symbol = {
    1:'+',
    2:'*'
}
def input_check(b): #检测输入是否合法
    while(True):
        x = input('%s::' %b)
        x_check = check(x)
        if x_check:
            return int(x)
        else:
            print('please input again')

def main():
    print("please input x and y")
    while(True):
        x = input_check('x')
        y = input_check('y')
        print('you input x = %d, y = %d' %(x,y))
        print('1::add\n2::multiply\n')
        while(True):
            choice = input_check('choice')
            if choice==1 or choice == 2:
                break
            else:
                print('please input again')
        print('Calcluate..................')
        end = mute[choice](x,y)
        print('%d %s %d = %d' %(x, symbol[choice], y, end))
        gets = input("you want to continue(Yes Contiue):")
        if gets.lower() != 'yes': #忽略yes的大小写
            break

if __name__ == '__main__':
    main()

封装,python 没有定义完全意义上的封装
第一个层面的封装:类就是麻袋,这本身就是一种封装
第二个层面的封装:类中定义私有的,只在类的内部使用,外部无法访问
第三个层面的封装:明确区分内外,内部的实现逻辑,外部无法知晓,并且为封装到内部的逻辑提供一个访问接口给外部使用(这才是真正的封装)

不同的对象调用相同的方法,执行的逻辑并不一样

类的继承有两层意义,1.改变,2,扩展
多态就是类的这两层意义的一个具体的实现机制
即,调用不同的类实例化的对象下的相同方法,实现的过程不一样

python 中的标准类型就多态概念的一个很好的示范

class test:
    __start = 55
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def run(self):
        print('name is %s, gender is %s' %(self.name, self.gender))

t = test('libai', 'none')
print(test.__dict__)
print(t.__dict__)
print(t._test__start) #外部可以访问内部的隐藏属性

输出结果:
{'__module__': '__main__', '_test__start': 55, '__init__': <function test.__init__ at 0x00000247925B4620>, 'run': <function test.run at 0x00000247925B46A8>, '__dict__': <attribute '__dict__' of 'test' objects>, '__weakref__': <attribute '__weakref__' of 'test' objects>, '__doc__': None}
{'name': 'libai', 'gender': 'none'}
55

设定封装的外部接口

class test:
    __start = 55
    def __init__(self, name, gender):
        self.__name = name  #封装
        self.gender = gender
    def run(self):
        print('name is %s, gender is %s' %(self.name, self.gender))
    def get_start(self):  #外部访问内部封装变量的接口
        return self.__start #内部访问隐藏变量不受影响
t = test('libai', 'none')
print(test.__dict__)
print(t._test__start)  #外部可以通过添加类名访问
print(t.__dict__)
print(t._test__name)  #添加类名访问
print(t.get_start())

输出结果:
{'__module__': '__main__', '_test__start': 55, '__init__': <function test.__init__ at 0x00000218E5FE4620>, 'run': <function test.run at 0x00000218E5FE46A8>, 'get_start': <function test.get_start at 0x00000218E5FE4730>, '__dict__': <attribute '__dict__' of 'test' objects>, '__weakref__': <attribute '__weakref__' of 'test' objects>, '__doc__': None}
55
{'_test__name': 'libai', 'gender': 'none'}
libai
55
上一篇下一篇

猜你喜欢

热点阅读