当前位置: 首页 > news >正文

9月20日学习内容整理:封装,私有属性方法,用装饰器描述的方法

补充:所有类的类型默认是type;对象名._ _dict_ _  把对象属性和对应的值组合成字典

封装:隐藏属性和实现细节,只对外公开访问方式

一、私有属性:

(1)实现:self._ _属性名  这样就设置成了私有属性

(2)只能在内部调用,在类外部是不能调用的

(3)若在外部添加双下划线的属性,这样是不会生效的,注意私有属性在外部定义是没有用的,只是添加了属性而已 

二、私有方法

(1)实现:def  _ _方法名(self)这样就设置成了私有方法

(2)只能在内部调用,外部不能调用

(3)注意在内部调用时只会调用自己的,若自己没有就会报错,不会去找父类的就算用super也会报错

(4)应用场景:定义的方法的返回值作为中间结果;父类的方法不希望子类调用

三、私有属性方法在python中如何不让外部调用

1、无论是双下划线方法名或是属性名,在python内部都是以  _类名_ _属性名或是方法名  这样的形式存在的,所以在外部调用双下划线时python内部是找不到的,所以外部没法调用,并且子类没有的话也找不到父类中重名的方法,因为类名不一样

2、如果非要在外部调用私有属性和方法,就用_类名_ _属性名或是方法名  去调用,但是尽量不要这么做

四、用装饰器描述的方法(通过python内部的函数)

1、property

(1)@property:将类中的方法伪装成属性,外部直接用.调用,不用加括号,但是在外部不能修改

class Person:
    def __init__(self,name,height,weight):
        self.name = name
        self.__height = height
        self.__weight = weight

    @property     #我理解为并不是真正的属性,只是改变了它外部调用的方式,所以在外部不能修改
    def bmi(self):
        return self.__weight / (self.__height*self.__height)

jinghong = Person('景弘',1.8,94)
print(jinghong.name,jinghong.bmi)

(2)@方法名.setter    可以修改被伪装的属性

class Shop:
    discount = 0.75
    def __init__(self,name,price):
        self.name = name
        self.__price = price
    @property
    def price(self):
        return self.__price * Shop.discount
    @price.setter
    def price(self,new_price):
        self.__price = new_price

apple = Shop('apple',5)
print(apple.price)
apple.price = 6       #这样就进行了修改
print(apple.price)

(3)@方法名.deleter    可以删除被伪装的属性

class Foo:
    @property
    def AAA(self):
        print('get的时候运行我啊')

    @AAA.setter
    def AAA(self,value):
        print('set的时候运行我啊')

    @AAA.deleter
    def AAA(self):
        print('delete的时候运行我啊')

f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA   #不会真正的删除,
f1.AAA       #还能正常调用

 

2、@staticmethod  静态方法

(1)什么时候用:完全使用面向对象编程,不能独立的放在类外面

         函数完全不需要依赖对象和属性,不能用类属性和对象属性

        没有必须要传的参数,但可以传自己需要的参数

3、@classmethod  类方法

(1)不能使用对象属性,但可以使用类属性

class Manager:

    @staticmethod    #静态方法
    def create_student(): pass

 

(2)必须传一个类cls,和不同方法必须传self一样

class A:
    role = 'a'
    @classmethod
    def class_method(cls):
        print(cls.role)

A.class_method()
A.role

 

转载于:https://www.cnblogs.com/wanghl1011/articles/7561942.html

相关文章:

  • 车联网上云最佳实践(三)
  • Codeforces Round #435 (Div. 2)
  • 机器学习概述
  • 背水一战 Windows 10 (32) - 控件(选择类): Selector, ComboBox
  • 从重复到重用
  • TPYBoard读取芯片上的温度传感器
  • 变量的保存重载和打印
  • Oracle将Java EE移交Eclipse基金会
  • Linux - 执行命令与脚本
  • HashMap ConcurrentHashMap
  • 第三百九十三节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置...
  • 软件下载
  • 7. Oracle数据加载和卸载
  • 工作的第6个年头发现DateFormat是not synchronized
  • JAVA自学笔记18
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • canvas 高仿 Apple Watch 表盘
  • HTML-表单
  • IndexedDB
  • IOS评论框不贴底(ios12新bug)
  • Java Agent 学习笔记
  • JAVA SE 6 GC调优笔记
  • JavaScript创建对象的四种方式
  • JS变量作用域
  • learning koa2.x
  • nginx 负载服务器优化
  • PHP 的 SAPI 是个什么东西
  • python 装饰器(一)
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • 高性能JavaScript阅读简记(三)
  • 基于组件的设计工作流与界面抽象
  • 简单易用的leetcode开发测试工具(npm)
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 最近的计划
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ###STL(标准模板库)
  • #if 1...#endif
  • $refs 、$nextTic、动态组件、name的使用
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C语言)二分查找 超详细
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Matlab)使用竞争神经网络实现数据聚类
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (排序详解之 堆排序)
  • (十一)c52学习之旅-动态数码管
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (算法设计与分析)第一章算法概述-习题
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转载)hibernate缓存
  • .bat批处理(四):路径相关%cd%和%~dp0的区别