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

 class Goods:
def __init__(self,name,price):
self.name=name
self.__price=price #此处将价格属性封装私有化,别人通过对象.price找不到
h=Goods('苹果',10)
print(h.price) #>>>> 报错'Goods' object has no attribute 'price'
print(h._Goods__price) #可以查看被封装属性
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) #只支持显示,不可以修改删除

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

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

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

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

总结:
如果定义的是一个普通的变量或者属性
    那么这个属性可以从外部直接调用
   可以任意修改   obj.a=123
     甚至可以删除   del obj.a
私有化封装
    把一个属性加上双下划线__属性名/def __函数名()这个属性就被隐藏,外面不以直接查看调用
但是有些场景需要显示给别人,但不允许更改
    用@property装饰显示动作的函数,这样不用括号也可以调用函数来显示
    __属性
    @property
    def 属性名():
        return 属性对应值(或对属性执行动作后显示值)
显示属性值时,先定义对象,在用对象名.属性调用函数显示,只是这时候的函数被装饰后不用()也能调用
我们允许别人看,也允许别人改,但要按规则修改,数据类型,范围等否则不生效
    @属性.setter
    def 属性(self,value)
        if============要修改时的范围及判断条件
        self.属性=value
先定义对象, 修改属性值时,在用对象名.属性=value,调用函数时,通过条件显示修改后值,没通过显示原来的被装饰函数的值

面向对象的封装(私有化)及@property(查看)/@setter(修改)!!!的更多相关文章

  1. 面向对象 - 1.封装之如何实现属性的隐藏/2.封装的意义/3.封装与扩展性/4.property的使用

    1.封装之如何实现属性的隐藏封装: __x=1 # 把数据属性隐藏 (如何实现隐藏) 类定义阶段 __开头发生了变形 __x --> _A__x特点: 1.在类外部无法直接:obj.__Attr ...

  2. 面向对象编程(封装、封装的意义、封装与扩展性、@property)

    1.封装之如何实现属性的隐藏 封装: __x=1 # 把数据属性隐藏 (如何实现隐藏) 类定义阶段 __开头发生了变形 __x --> _A__x特点: 1.在类外部无法直接:obj.__Att ...

  3. python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property

    一.面向对象绑定方法 一.类中定义的函数分成两大类 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 ...

  4. Python面向对象之封装、property特性、绑定方法与非绑定方法

    一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...

  5. 封装,封装的原理,Property ,setter ,deleter,多态,内置函数 ,__str__ , __del__,反射,动态导入模块

    1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 pyt ...

  6. python 面向对象之封装与类与对象

    封装 一,引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,小老虎一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的 二,先看如何隐藏 在 ...

  7. day 26面向对象 的封装 接口 抽象

    大纲分析 # 面向对象# 类 :一类具有相同属性和方法的事物 #类的定义:class #类中可以定义的方法种类: #普通方法 self 对象 #类方法 cls @classmethod 类/对象 #静 ...

  8. Python面向对象:封装和多态

    一.封装 封装是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别. 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进 ...

  9. python面向对象编程 -- 封装、继承

    面向对象编程 -- 封装.继承 面向对象编程三要素:封装.继承和多态.本文主要看和封装.继承相关的概念:在python中多态的概念比较模糊,本文不做讨论. 1 封装 封装:将数据和操作组装到一起,对外 ...

随机推荐

  1. Mac os的使用

    来北京入职java开发实习,公司标配macook.一开始不会使用macos系统,用起来很不适应,我是拒绝的.但是leader说mac是开发效率最高的工具了·.一开我很怀疑,后来觉得mac系统用起来还真 ...

  2. Spring-Boot之Redis基础

    Spring-Boot之Redis基础 准备 Redis下载地址:github.com/MSOpenTech/redis/releases Redis数据库的默认端口号是 6379 开启Redis服务 ...

  3. Ubuntu常用操作命令

    解压文件: tar -zxvf 文件名 -C 指定目录 从当前环境进入root环境: su,然后输入root密码

  4. WdatePicker日历添加事件,在任意月改变时处理日期事件

    原由 在做系统时根据要求有时候需要屏蔽掉某些特殊的日期,像周日或者法定假日,以及一些调班的日期:使用WdatePicker可以屏蔽掉周日和大多数法定假日,但像清明或者调班的日期则不好处理. 想法 1: ...

  5. TX2-入门坑点-Ubuntu16.04任务栏消失

    问题:安装cuda过程中出现任务栏消失,快捷键失效的现象. 解决方法:重装桌面无法解决,使用cssm无法解决,最后删除home目录下的 .cache文件夹重启后解决

  6. php直接执行linux 命令

    注意你可以使用的命令只能是php这个用户组的权限和范围,注意这个linux 执行的,windows也是可以对应dos命令,但是打印格式不是很好看 //$output = `ls -al`; //$ou ...

  7. 解决键盘输入被JDB占用的问题

    解决键盘输入被JDB占用的问题 本周的任务"迭代和JDB"在使用JDB调试时需要键盘输入数据,但我在正确的位置输入数据后发现JDB提示如图所示的错误. 上网查找后得知该错误的产生是 ...

  8. JavaScript面向对象之get和set设置读写属性

    之前我们通过this和prototype申明的属性都是可读写的属性,如果想实现单独控制,就必须使用get和set存取期. 基本方法的 步骤一般包含两个步骤,1,使用var关键字定义一个私有属性作为中间 ...

  9. [dpdk][hotplug] DPDK网卡设备热插拔

    dpdk pci网卡设备的热插拔. 样例程序如下: ... ... static int driverctl(char* pci) { int pid; pid = fork(); ) { execl ...

  10. 指数型生成函数(EGF)学习笔记

    之前,我们学习过如何使用生成函数来做一些组合问题(比如背包问题),但是它面对排列问题(有标号)的时候就束手无策了. 究其原因,是因为排列问题的递推式有一些系数(这个待会就知道了),所以我们可以修改一下 ...