面向对象特征:封装、多态 以及 @propetry装饰器

(继承补充)组合
 obj=fun()#对象
 obj.attr=foo()#对象的属性等于另一个对象
 什么是组合: 
    A类的对象具备某一个属性,该属性的值是B类的对象
    基于这种方式就把A类与B类组合到一起
    对象既能使用A类中的数据与功能,也能使用B类中的数据与功能
 为什么要用组合:
     组合与继承的作用一样,都是用来减少类与类之间的重复代码
 #组合不属于继承
 #类使用将变量及处理其的函数捆绑起来
 #继承是强耦合,组合是解耦合
 如何用组合:
  class People:
     def __init__(self,name,age):
        self.name=name
        self.age=age
        self.eat=[]
     def tell_eat(self):
        for i in self.eat:
           i.tell_info()
     
  class Eat:
     def __init__(self,e_name,e_price):
        self.e_name=e_name
        self.e_price=e_price
     def tell_info(self):
        print('食物%s 价格%s'%(self.e_name,self.e_price))
p=People('张三',18)
  eat1=Eat('肯德鸡',38)
  eat2=Eat('烤乳猪',120)
  p.eat.append(eat)
  
 多态与多态性
        什么是多态:
        同一种事物有多种形态在程序中用继承可以表现出多态
        多态性:
        在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象
        多态性的精髓:统一
  import abc
  class Animal(metaclass=abc.ABCMeta):#强制子类使用这套标准中加@..的名字,子类没有报错
     @abc.abstractmethod   #被强制的名字
     def speak(self):
        pass
    
     def run(self):
        pass
  # Animal() # 父类只是用来建立规范的,不能用来实例化的,更无需实现内部的方法
class People(Animal):
     def speak(self):
        print('say hello')
class Dog(Animal):
     def speak(self):
        print('汪汪汪')
     def run(self):
        pass
           
        python推崇鸭子类型:(像什么,就有什么的特征)
            class Txt:
                def read(self):
                    pass
            class Disk:
                def read(self):
                    pass
     
#BMI=体重(kg)÷身高^2(m)
#首先需要明确。bmi是算出来的,不是一个固定死的值,很明显人的bmi值听起来更像一个名词而非动词,于是我们需要为bmi这个函数添加装饰器将其伪装成一个数据属性
# @property装饰器是用来将类内的函数属性伪装成数据属性
#@property装饰的函数可以调setter及deleter
# class People:
#     def __init__(self,name):
#         self.__name=name
#
#     @property
#     def name(self):
#         return '<名字:%s>' %self.__name
#
#     @name.setter
#     def name(self,obj):
#         if type(obj) is not str:
#             print('name必须为str类型')
#             return
#         self.__name=obj
#
#     @name.deleter
#     def name(self):
#         # print('不让删')
#         del self.__name
#
# obj=People('egon')
#
# # print(obj.name)
# # obj.name='EGON'
# # obj.name=123
# # print(obj.name)
#
# del obj.name
# print(obj.__dict__)

封装
 self.__name=name #_类名__name 定义阶段转形
 什么是封装
     装:往容器/名称空间里存入名字
     封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内
补充说明:封装绝对不是单纯意义的隐藏
    需知定义属性的目的就是为了让使用者去用,使用者要想使用类内部隐藏的属性
    需要类的设计者在类内部开一个接口(定义一个方法),在该方法内访问隐藏的属性
    ,使用者以后就通过该方法来“间接地”访问内部隐藏的属性
    作为类的设计者可以在接口之上附加任意逻辑从而严格控制类的使用者对属性的操作
 如何封装?
        1. __开头的属性实现的隐藏仅仅只是一种语法意义上的变形,并不会真的限制类外部的访问
        2. 该变形操作只在类定义阶段检测语法时发生一次,类定义阶段之后新增的__开头的属性并不会变形
        3. 如果父类不想让子类覆盖自己的属性,可以在属性前加__开头
 封装形式?
  封装数据属性:把数据属性封装起来,然后需要开辟接口给类外部的使用者使用,好处是我们可以在接口之上添加控制逻辑,从而严格空间访问者对属性的操作
  class People:
                def __init__(self,name):
                    self.__name=name
def tell_name(self):
                    # 添加逻辑
                    return self.__name
     
  封装函数属性:隔离复杂度
            class ATM:
                def __card(self):
                    print('插卡')
                def __auth(self):
                    print('用户认证')
                def __input(self):
                    print('输入取款金额')
                def __print_bill(self):
                    print('打印账单')
                def __take_money(self):
                    print('取款')
def withdraw(self):
                    self.__card()
                    self.__auth()
                    self.__input()
                    self.__print_bill()
                    self.__take_money()
  封装的终极奥义:明确地区分内外,对外是隐藏的,对内是开放的

转载于:https://www.cnblogs.com/3sss-ss-s/p/9511760.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15 错误边界与使用技巧

错误边界 React16增加防止某个组件的UI渲染错误导致整个应用崩溃子组件发生JS错误&#xff0c;有备用的渲染UI错误边界是组件&#xff0c;只能用class组件来写 错误边界组件捕获错误的时机 渲染时生命周期函数中组件树的构造函数中 getDerivedStateFromError 生命周期函数…

深入探究Spark -- Cluster Manger部署(最常用为YARN实现Task Scheduler)

部署方式有&#xff1a;Standalone&#xff08;Spark的Deploy模块&#xff09;、Mesos、YARN、EC2、LocalSparkContext创建时&#xff0c;通过传入的Master URL不同&#xff0c;创建不同的SchedulerBackend和TaskScheduler&#xff0c;在spark.SparkContext#createTaskSchuster…

es6 --- Promise.all等待多个异步任务执行

项目中遇到一个问题,要用多个http请求,获取数据,然后将获取的数据统一处理… 第一反应想到用promise.all来做… 下面进入主体 // 首先使用promise封装http请求. function getListByDetecttype (params) {return new Promise((resolve, reject) > {let param params ? par…

16 代码分割之错误边界与Suspense和命名导出

代码分割之错误边界与Suspense const Main React.lazy(() > import(./main)) class ErrorBoundary extends React.Component {state {hasError: false,}static getDerivedStateFromError(err) {console.log(getDerivedStateFromError err, err)return {hasError: true}}c…

Python 原生爬虫

Python3 实现游戏主播人气排行榜 from urllib import request import re# 爬取某个游戏主播的人气&#xff08;每个游戏主播的观看人数&#xff09;排行榜 爬虫前奏&#xff1a;明确爬虫目的找到数据对应的网页分析网页的结构找到数据所在的标签位置模拟HTTP请求&#xff0c;向…

Mac 下查看网络端口占用情况

1、Mac 下查看网络端口占用情况 有的时候关闭了服务器&#xff0c;但是端口还是占用&#xff0c;解决的方法是 kill 掉占用该端口的进程。 # 查看 8009 端口的占用情况 $ lsof -i:8009 可以看到&#xff0c;该端口被 id 为 4215 的进程所占用&#xff0c;这个时候直接在命令…

javascript --- 变量提升的理解

看下面一段代码: (function () {var x foo();var foo function foo () {return "foobar";};return x; })();(不许打出来)猜猜返回结果是什么… 答案是 // foo is not a function下面来解释为什么会这样,首先得明白: 1.如果变量声明了但未赋值,则会显示undefined…

17 初探Context的使用场景

context 容器&#xff08;即上下文&#xff09; → 装数据 → 可以传递到程序的多个地方程序在执行时可访问的容器 import styles from ...则css要写module.css&#xff0c;否则无效果&#xff1b; import from ...则css无须写module. &#xff0c;否则无效果 使用 context.j…

分布式监控系统开发【day37】:需求讨论(一)

本节内容 为什么要做监控&#xff1f; 常用监控系统设计讨论监控需求讨论如何实现监控服务器的水平扩展&#xff1f;监控系统架构设计一、为什么要做监控&#xff1f; 熟悉IT监控系统的设计原理开发一个简版的类Zabbix监控系统掌握自动化开发项目的程序设计思路及架构解藕原则…

iOS:练习题中如何用技术去实现一个连线题

一、介绍 本人做的app涉及的是教育行业&#xff0c;所以关于练习题的开发肯定是家常便饭。例如&#xff0c;选择题、填空题、连线题、判断题等&#xff0c;每一种题型都需要技术去实现&#xff0c;没啥多大难度&#xff0c;这里呢&#xff0c;就给出实现连线题的核心代码吧。过…

18 Context与组合的应用场景与使用问题

contextType 指定context类型为创建的上下文&#xff0c;此时不需要用Consumer组件包裹&#xff0c;使用this.context即可访问会向上找最近的上下文并取值最适合的场景&#xff1a;杂乱无章的组件都需要同一些数据&#xff1b;若单纯为了不层层传递属性&#xff0c;使用contex…

http --- 共享加密(对称加密)的几个概念

使用互联网进行数据传输时,可能会产生以下四个问题: 1. 窃听: A向B发送的消息,有可能在传输过程中被X窃听到 2. 假冒: A收到来自B的消息有可能是X冒充的 3. 篡改: A确实收到来自B的消息,但是该消息有可能被X篡改了 4. 事后否认:B确实收到了来自A的消息,但是A是恶意用户,当A像B…

213. House Robber II 首尾相同的偷窃问题

&#xff3b;抄题&#xff3d;&#xff1a; You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of…

原型链

<!DOCTYPE html><html><head lang"en"> <meta charset"UTF-8"> <title></title></head><body><script> /* 原型中的默认属性 原型链&#xff1a;当调用构造函数&#xff08;Fn()&a…

http --- 公开密钥加密(非对称加密)的几个概念

公开密钥加密: 公钥加密,私钥解密 公开密钥加密的处理流程: 1. A准备通过互联网向B发送数据 2. B生成公钥P和私钥S 3. B将P发送给A 4. A使用P进行加密,并将密文通过互联网发送给B 5. B使用S进行解密得到数据公钥加密的更具体的栗子: 1.B首先准备好公钥P和私钥S 2.B将公钥发布…

19、20 Context API

安装React Dev Tool Context对象.displayName 使用别名 不使用别名 React.createContext 创建指定的Context对象组件会找离自己最近的Provider&#xff0c;获取其value变量名都叫value的情况&#xff0c;就近取AContext变量名有所区分&#xff0c;两个value都可以获取可以…

01-spring配置详解

1 bean元素 <!--将User对象交给spring容器进行管理 --><!-- Bean元素:使用该元素描述需要spring容器管理的对象class属性:被管理对象的完整类名.name属性:给被管理的对象起个名字.获得对象时根据该名称获得对象. 可以重复.可以使用特殊字符.id属性: 与name属性一模一…

第八模块:算法设计模式、企业应用 第2章 企业应用工具学习

第八模块&#xff1a;算法&设计模式、企业应用 第2章 企业应用工具学习转载于:https://www.cnblogs.com/tqtl911/p/9131614.html

http --- 混合加密的具体过程

混合加密: 共享加密存在一个“共享密钥”无法安全告知服务端的问题.公开加密存在,加密、解密速度慢的问题.混合加密则同时使用了2种加密技术,具体过程如下: 1. B提前生成公钥P和私钥S,并将P发布到网上 2. A想(通过互联网)像B发送数据 3. A从互联网上获取B的公钥P,并使用P对共享…

Vite+Vue3页面空白、图标不显示问题解决

页面空白问题 由于项目部署在子文件夹下&#xff0c;因此需要配置vite.config.js const config {base: ./, }el-icon图标不显示、打包时mkdir无权限 在控制台Network看字体图标的请求&#xff0c;发现地址多了_assets&#xff0c;本以为需要重新配置publicDir&#xff0c;后…