zoukankan      html  css  js  c++  java
  • 多态与封装

    1.多态:

       什么是多态: 一个类表现出的多种状态,通过类的继承来实现

      在java中一个函数要给的参数传指定的数据类型,如果这个地方有两个以上类型的参数,那么他应该有一个共同的父类,这个父类是所有子类对象的类型.

      在python中,所有的对象都有一个共同的父类,所有传参时不需要指定的数据类型,所以说python处处是多态.

    class Payment:pass
    class Applepay(Payment):
        def pay(self):pass
    class Alipay(Payment):
        def pay(self):pass
    def pay(obj,moneyz):
        obj.pay()
    app = Applepay()
    print(type(app))
    pay(app,123)
    alp = Alipay()
    pay(alp,456)
    

    2:多态 -- 鸭子类型:

      不是明确通过继承来实现多态,而是通过一个模糊的概念来判断这个函数能不能接受这个参数的类型.

    def len(obj):
    len()接受数据类型:str list tuple dict set range()
    print() 所有的对象都是鸭子类型
    

    3.封装

      1.广义的封装:为了只有这个类中的对象才能使用类中定义的方法.

      class 类名:

        def fun():pass

      2.狭义的封装:把一个名字藏在类中

    class Goods:
        __discount = 0 #私有的静态变量
        print(__discount)
    # print(Goods.__discoount) #在类的外部不能引用类的私有静态变量
    print(Goods.__dict__)
    print(Goods._Goods__discount) # 编程规范的角度上出发 我们不能在类的外部使用私有的变量

      

    class Student:
        def __init__(self,name,age):
            self.__name = name
            self.age = age
        @property
        def name(self):
            return self.__name
    obj = Student('黎明',12)
    print(obj.name)
    print(obj.age)
    

      3:类中的私有成员:

        私有的静态属性

        私有的对象属性

        私有的方法

      4.我们为什么要定义私有变量:

        不希望别人看到这个值

        不希望别人修改这个值

        想让修改这个值有所限制

        有些方法或属性不希望子类继承 

    class  Goods:
        __discount = 1.5 #私有的静态属性
        def __init__(self,name,price):
            self.name = name
            self.__price = price
        @property
        def price(self):
            return self.__price * Goods.__discount
        @property
        def change_price(self,new_price):
            if type(new_price) is int:
                self.__price = new_price
            else:
                print('本次价格修改不成功')
    apple = Goods('APPLE',5)
    # print(apple.price)
    apple.change_price(10)
    print(apple.price)
    

      

    class User:
        def __init__(self,username,password):
            self.usr = username
            self.__pwd = password
            self.pwd = self.getpwd()
        def __getpwd(self):
            return hash(self.__pwd)
    obj = User('alex','sdf124')
    print(obj.usr,obj.pwd)
    

      5:私有变量能不能继承:

        

    class A:
        __country = 'China'
        def __init__(self,name):
            self.__name = name #_A__name
    class B(A):
        print(__country) #NameError:name"_B__country" is not defined
        def get_name(self):
            return self.__name #'_B__name'
    b = B('alex')
    print(b.__dict__)
    

    4:装饰器函数:property

      装饰器函数怎么用?在类,方法,函数的上面一行@装饰器函数 

    class Student:
        def __init__(self,name,age):
            self.__name = name
            self.age = age
        @property  #将方法伪装成一个属性
        def person(self):
            return self.__name
    obj = Student('黎明',30)
    # print(obj.person())
    print(obj.person)
    
  • 相关阅读:
    PHP-会话控制
    PHP-文件上传
    PHP-文档目录
    PHP-正则表达式
    PHP-数组类型
    PHP-函数编程
    PHP-基础知识
    $_FILES系统函数
    话说 MAX_FILE_SIZE
    Hello~! 我的blog
  • 原文地址:https://www.cnblogs.com/lijinming110/p/9556751.html
Copyright © 2011-2022 走看看