zoukankan      html  css  js  c++  java
  • 面向对象的封装(私有化)及@property(查看)/@setter(修改)!!!

    面向对象有三大特性,继承,多态,封装
    继承可以减少代码重复量,多态可以用多继承模仿别的语言的建立规则约束子类
    封装为类的属性/方法的私有化,可以限制别人看,读,修改的权限,目前理解做记录,日后温习,回顾,改善
    类的封装中用(__属性名),方法也类似def __方法名():

    1 class Goods:
    2     def __init__(self,name,price):
    3         self.name=name
    4         self.__price=price    #此处将价格属性封装私有化,别人通过对象.price找不到
    5 h=Goods('苹果',10)
    6 print(h.price)                #>>>> 报错'Goods' object has no attribute 'price'
    7 print(h._Goods__price)        #可以查看被封装属性  
    8 print(h.__dict__)    #可以查看到对象中所有属性{'name': '苹果', '_Goods__price': 10}

    所有的方法都是在类定义的时侯完成的,只能在内的内部使用,不可以在外部引用或者继承下去

    隐藏的私有化属性/方法实际上要查看方法:

    1.定义一个动作,def 属性():他的作用是返回被隐藏的属性内容(print或者return),外部调用这个动作(调用时属性(),注意要用括号)

    2.用_类名__属性名来查看到,但是不可以修改

    如果封装的是一个类似属性的动作,逻辑上不该用(),那么用@property装饰这个属性,去除括号可调用

    import time
    class Y:
        def __init__(self,name,birth):
            self.name=name
            self.birth=birth
        @property                                       #加装饰器让函数调用age时不再用(),更像输出一个属性
        def age(self):
            t=time.localtime()
            age=t.tm_year-int(self.birth.split('-')[0])
            print(age)
    a=('a','1991-10-12')
    #原来应该为a.age()
    print(a.age)                                         #只支持显示,不可以修改删除                                      

     在此基础上,我们可以将隐藏属性通过动作打印出来,但是避免动作执行时(),且通过动作显示的结果,只能查看,而不能修改,删除,我们还能加上一些执行动作,

    使我们封装的属性按想要的方式显示出来,

     1 class Goods:
     2     discount=0.8
     3     def __init__(self,name,price):
     4         self.name=name
     5         self.__price=price
     6     @property                              #添加一个显示隐藏属性的动作,去输出显示值,但是不可以修改
     7     def price(self):
     8         return self.__price*self.discount  #想要显示的方式需要的执行动作
     9     @price.setter                          #添加修改装饰函数
    10     def price(self,value):
    11         if value>=1:
    12             self.__price=value
    13 a=Goods('a',10)
    14 print(a.price)         #这里是通过调用7函数,执行8,后返回的结果
    15 a.price=0.1            #这里通过10函数修改封住属性值,但是修改动作中有11判断条件
    16 print(a.price)         #不满足条件,所以并未改变,若满足即可修改

    上面代码第9行以后,用来修改隐藏属性,同时可以添加修改判断条件,满足后执行查看显示的是当前函数的值,不满足仍按原来的函数执行结果显示

    总结:
    如果定义的是一个普通的变量或者属性
        那么这个属性可以从外部直接调用
       可以任意修改   obj.a=123
         甚至可以删除   del obj.a
    私有化封装
        把一个属性加上双下划线__属性名/def __函数名()这个属性就被隐藏,外面不以直接查看调用
    但是有些场景需要显示给别人,但不允许更改
        用@property装饰显示动作的函数,这样不用括号也可以调用函数来显示
        __属性
        @property
        def 属性名():
            return 属性对应值(或对属性执行动作后显示值)
    显示属性值时,先定义对象,在用对象名.属性调用函数显示,只是这时候的函数被装饰后不用()也能调用
    我们允许别人看,也允许别人改,但要按规则修改,数据类型,范围等否则不生效
        @属性.setter
        def 属性(self,value)
            if============要修改时的范围及判断条件
            self.属性=value
    先定义对象, 修改属性值时,在用对象名.属性=value,调用函数时,通过条件显示修改后值,没通过显示原来的被装饰函数的值
  • 相关阅读:
    python-面向对象-05_面向对象封装案例 II
    python-面向对象-06_私有属性和私有方法
    python-面向对象-07_继承
    python-面向对象-08_多态
    python-面向对象-09_类属性和类方法
    CentOS 7 安装
    lnmp 一键搭建脚本
    shell 函数与内置变量
    linux无敌权限之chattr
    linux运维配置讲解--sshd-config
  • 原文地址:https://www.cnblogs.com/OB19227/p/10622200.html
Copyright © 2011-2022 走看看