• python面向对象之封装


    一、封装

    优点:(1)将变化隔离

             (2)封装使用

            (3)提高复用性

           (4)提高安全性

    封装原则:(1)将不需要对外提供的内容都隐藏起来

                    (2)把属性都隐藏,提供公共方法对其访问

    二、私有变量和私有方法

    在python中用双划线的开头的的方式降属性隐藏起来(设置私有的)

    私有变量

    #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式:
    
    class A:
        __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N
        def __init__(self):
            self.__X=10 #变形为self._A__X
        def __foo(self): #变形为_A__foo
            print('from A')
        def bar(self):
            self.__foo() #只有在类内部才可以通过__foo的形式访问到.
    
    #A._A__N是可以访问到的,即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形

    自动变形特点

    1、类中定义的_n只能内部使用,如self._n引用的就是变形的结果

    2、这种变形其实是针对外部变形,在外部是无法通过_n这个访问到的

    3.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

    变形注意的问题:

    1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N

    2.变形的过程只在类的定义是发生一次,在定义后的赋值操作,不会变形

    3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的

    正常的
    class Parent:
        def __init__(self):
            self.func()
        def func(self):
            print('Parent func')
    class Son(Parent):
        def func(self):
            print('Son func')
    s=Son()
    
    
    把func定为私有的,即__func
    
    class Parent:
        def __init__(self):
            self.__func()
        def __func(self):
            print('Parent func')
    class Son(Parent):
        def __func(self):
            print('Son func')
    s=Son()

    property属性

    property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

    例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)
    
    成人的BMI数值:
    过轻:低于18.5
    正常:18.5-23.9
    过重:24-27
    肥胖:28-32
    非常肥胖, 高于32
      体质指数(BMI)=体重(kg)÷身高^2(m)
      EX:70kg÷(1.75×1.75)=22.86
    例一
    class People:
        def __init__(self,name,weight,height):
            self.name=name
            self.weight=weight
            self.height=height
        @property
        def bmi(self):
            return self.weight / (self.height**2)
    
    egg=People('egon',75,1.85)
    print(egg.bmi)
    View Code
    from math import pi
    class Circle:
        def __init__(self,radius):
            self.radius=radius
        @property
        def area(self):
            return pi*self.radius**2
        @property
        def perimeter(self):
            return  2*pi*self.radius
    c=Circle(10)
    print(c.area)
    print(c.perimeter)
    圆的周长和面积
    class Num:
        def __init__(self,*args):
            if len(args) == 1 and (type(args[0]) is list or type(args[0]) is tuple):
                self.members = args[0]
            else:
                self.members = args
    
        @property
        def sum(self):
            return sum(self.members)
    
        @property
        def average(self):
            return self.sum/len(self.members)
    
        @property
        def min(self):
            return min(self.members)
    
        @property
        def max(self):
            return max(self.members)
    nums = Num([1,2,3])
    print(nums.sum)
    print(nums.average)
    print(nums.min)
    print(nums.max)
    num2 = Num(4,5,6)
    print(num2.sum)
    print(num2.average)
    print(num2.min)
    print(num2.max)
    View Code
  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/mengqingjian/p/7366587.html
Copyright © 2020-2023  润新知