zoukankan      html  css  js  c++  java
  • 面向对象:多态和封装、property

    多态指的是一类事物有多种形态:python天生支持多态
    例如:
    class Wechat:
        def pay(self,money):
            print('支付%s钱'%money)
    
    class Alipay:
        def pay(self,money):
            print('支付%s钱'%money)
    
    class Applepay:
        def pay(self,money):
            print('支付%s钱'%money)
    
    # python中直接调用传参给payment即可调用上方所有类的方法
    def pay(payment,maoney):
        payment.pay(maoney)

    多态:在java中,由于是强数据类型,调用这些类需要给他们创建一个父类,意思就是允许将子类类型的指针赋值给父类类型的指针
    class Payment:#父类
        pass
    
    class Wechat(Payment):
        def pay(self,money):
            print('支付%s钱'%money)
    
    class Alipay(Payment):
        def pay(self,money):
            print('支付%s钱'%money)
    
    class Applepay(Payment):
        def pay(self,money):
            print('支付%s钱'%money)
            
    def pay(Payment payment,int maoney):#这里的Payment是父类Payment,在java中只有这样才能使用到子类Wechat等
        payment.pay(maoney)

    封装:

      广义:面向对象的封装是对代码的保护,面向对象的思想本身就是一种,只让自己的对象能调用自己类中的方法就是一种封装

      狭义:是面向对象的三大特性之一,属性和方法都藏起来,不让你能在外部调用,让你看不见

    使用方法:名字前面加双下划线

    class Person:
        def __init__(self,name,money):
            self.name = name
            self.__money = money        #被封装,可以在类里使用
        def __drawing(self):            #被封装,可以在类里使用
            print('我画画很好,但是保密')
        def func(self):
            self.__drawing()            #调用被封装的方法
            print(self.__money)         #调用被封装的属性
    
    aike = Person('aike',1000)
    print(aike.name)
    print(aike.__dict__)#被封装的属性以类名加属性的名字存在字典当中
    print(aike._Person__money)#用key可以查看被封装的值,但是不建议这样使用
    aike.func()#调用正常方法
    print(aike.money)#被封装起来,无法调用,会报错
    aike.__drawing#被封装起来,无法调用,会报错

     会用到封装的场景:

    1.隐藏起一个属性 不想让类的外部调用

    2.我想保护这个属性,不想让属性随意被改变

    3.我想保护这个属性,不被子类继承

    class Person:
        def __init__(self,name,money):
            self.__name = name
            self.__money = money
        def get_name(self):
            return self.__name
        def set_name(self,new_name):
            if type(new_name) is str and new_name.isdigit() == False:
                self.__name = new_name
                return self.__name
    
    class Func(Person):
        print(Person.__name) #报错,父类被封装的属性或者方法不能被子类继承
    
    aike = Person('aike',1000)
    print(aike.get_name())
    print(aike.set_name('艾克'))
    print(aike.get_name())

    property、setter、deleter:不改变对象调用属性名的方式(obj.name),实现被封装属性的查看、修改、删除

    #以上方例子为例
    class Person:
        def __init__(self,name,money):
            self.__name = name
            self.__money = money
        @property #查看
        def name(self):
            return self.__name
        @name.setter #修改
        def name(self,new_name):
            self.__name = new_name
            return self.__name
        @name.deleter #删除
        def name(self):
            del self.name
    aike = Person('aike',1000)
    print(aike.name)
    aike.name = '艾克'
    print(aike.name)
    # del aike.name 
  • 相关阅读:
    @SuppressWarnings("rawtypes") 是什么含义
    Oracle存在则更新,不存在则插入应用-merge
    word 2010中设置默认粘贴为 只保留文本粘贴【visio也适用于快捷键方式】
    List的remove()方法的三种正确打开方式
    纵表和横表的概念及其相互转换
    log4j.xml简单配置实现在控制台打印sql执行语句【加注释】
    NGUI例子Scroll View场景中item添加点击后自动滑到终点
    unity3d 日志捕捉
    Unity3D研究院之动态修改烘培贴图的大小&脚本烘培场景
    Unity3D研究之Prefab里面的Prefab关联问题
  • 原文地址:https://www.cnblogs.com/aizhinong/p/11469155.html
Copyright © 2011-2022 走看看