第二十六天 组合 封装 多态

上节内容回顾:

  1.继承

    ps:继承解决的是类与类之间的代码冗余问题

  2.如何继承:先抽象 再继承

  3.Python 中继承的特点:

    1.

      单继承

      多继承

    2.

      新式类

      经典类

今日内容:

  1.组合

  2.封装

  3.多态

一.组合

1.什么是组合

  一个对象的属性是来自另一外一个类的对象,称之为组合

2.为何用组合

  组合也是用来解决类与代码冗余的问题

3.如何用组合

class Foo:
    aaa=1111
    def __init__(self,x,y)
        self.x=x
        self.y=y

    def func1(self):
        print(‘Foo内的功能‘)

class Bar:
    bbb=2222
    def __init__(self,m,n):
        self.m = m
        self.n = n

    def func2(self):
        print(‘Bar内的功能‘)
obj1=Foo(10,20)
obj2=Bar(30,40)

obj1.xxx=obj2
print(obj1.x,obj1.y,obj1.aaa,obj1.func1)

print(obj1.xxx.m,obj1.xxx.n,obj1.xxx.bbb,obj1.xxx.func2)

组合另一个类中的多个对象

class OldboyPeple:
    school = ‘Oldboy‘
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

class OldboyStudent(OldboyPleople):
    def choose_course(self):
        print(‘%s is choosing course‘%self.name)

class OldboyTeacher(OldboyPeople):
    def choose_course(self):
        stu,num=num
        print(‘老师%s给学生%s打分%s‘%(self.name,stu.name,num))

class Course:
    def __init__(self,course_name,course_price,course_period):
        self.course_name = course_name
        self.course_price=course_price
        self.course_period=course_period

    def tell_course(self):
        print(‘课程名:<%s>价格:[%s] 周期:[%s]%(self.course_name,self.course_price,self.course_period))

python_obj = Course(‘python开发‘,3000,‘5mons‘)
linux_obj=Course(‘linux运维‘,5000,‘3mons‘)

stu1=OldboyStudent(‘egon‘,18,‘male‘)
stu1.course=[]
stu1.courses.append(linux_obj)stu1.courses.append(python)obj)stu1.courses[0].tell_course()

二.封装

1.什么是封装

  装指的是吧属性装进一个容器

  封指的是隐藏的意思,但是这种隐藏式对外不内的

2.为何要封装

  封装不是单纯意义的隐藏

  封装数据属性的目的:将数据属性封装起来,类外的使用就无法直接操作该数据属性了

  需要内部开一个接口给使用者,类的实际者可以在接口上附带任何逻辑,从而严格

  控制使用者对属性的操作

  封装函数属性的目的:隔离复杂度

3.如何封装

  只要在属性前加上__开头,该属性就会被隐藏起来,该隐藏具备的特点:

    1.只要一种语法意义上的变形,即__开头的属性会在检测语法时发生变形,_类名__属性名.

    2.这种隐藏是对外不对内的,因为在类内部检测语法时所有的代码统一都会发生变形

    3.这种变形值在检测时发生一次,在类定义之后新增的__开头的属性并不会发生变形

    4.如果父类不想让子类覆盖自己的属性,可以在属性前加__开头.

#其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形
#类中所有双下划线开头的名称如__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是可以访问到的,
#这种,在外部是无法通过__x这个名字访问到。

内部调用

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()

a=ATM()
a.__card(self)
a.withdraw()

隐藏的属性可以被内部使用

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()

a=ATM()
a.__card(self)
a.withdraw()

三.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)

obj=People(‘egon‘,70,1.82)
obj.height=1.85

print(obj.bmi)

property的需要了解的用法

class People:
    def __init__(self,name)
        self.__name=name

    @property
    def name(self)
        return‘<name:%s>self.name

    @name.setter
    def name(self,new_name):
        if type(new_name)is not str:
            print(‘名字必须是str类型")
            return
        self.__name=new_name

    @name.deleter
    def name(self)
        del self.name
obj=People(‘egon‘)
print(obj.name)

obj.name=123
print(obj.name)

def obj.name
print(obj.__dict__)

四.多态,

1.什么是多态

  同一事物的多种形态

2.为何要用多态

  多态性:指

import abc

class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        pass

# Animal() # 父类不能实例化,因为父类本身就是用来制定标准的
class People(Animal):
    def speak(self):
        print(‘say hello‘)
    # def jiao(self):
    #     print(‘say hello‘)

class Dog(Animal):
    def speak(self):
        print(‘汪汪汪‘)

class Pig(Animal):
    def speak(self):
        print(‘哼哼哼‘)

peo=People()
dog1=Dog()
pig1=Pig()
#
#
peo.speak()
dog1.speak()
pig1.speak()
def speak(animal):
    animal.speak()

speak(peo)
speak(dog1)
speak(pig1)

的是可以在不用考虑对象具体类型的前提下而直接使用对象的方法

3.如何用多态

原文地址:https://www.cnblogs.com/gongcheng-/p/9845919.html

时间: 2024-11-10 01:25:01

第二十六天 组合 封装 多态的相关文章

javaSE第二十六天

第二十六天????414 1:网络编程(理解)????414 (1)网络编程:用Java语言实现计算机间数据的信息传递和资源共享????414 (2)网络编程模型????414 (3)网络编程的三要素????414 (4)网络编程中主要类介绍:????416 A:InetAddress: 此类表示互联网协议 (IP) 地址.????416 B:????UDP协议下的Socket对象类DatagramSocket????418 1.发送端:????418 2.接收端:????419 C:????T

python入门第二十六天--网络通信

网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的通信. 举个例子,当你使用浏览器访问新浪网时,你的计算机就和新浪的某台服务器通过互联网连接起来了,然后,新浪的服务器把网页内容作为数据通过互联网传输到你的电脑上. 由于你的电脑上可能不止浏览器,还有QQ.Skype.Dropbox.邮件客户端等,不同的程序连接的别的计算机也会不同,所以,更确切地说,网络

第二十六天 蛰伏的Hibernate遇到春日的暖阳 —Spring MVC 集成Hibernate使用(一)

6月7日,晴."纷纷红紫已成尘,布谷声中夏令新.夹路桑麻行不尽,始知身是太平人."        Hibernate和Spring的香艳相逢,不仅是Bean和Bean之间电光火石般的碰撞,也是XML和XML之间的萍水聚首.两种奇妙的架构,携手闯荡江湖,不仅塑造了依赖注入淋漓酣畅的快感,也让J2EE蹿红大半个地球. 第二十六天 蛰伏的Hibernate遇到春日的暖阳 -Spring MVC 集成Hibernate使用(一)

组合, 封装, 多态补充

一. 什么是组合 对象的属性是另一个对象或者可以认为一个对象是另一个对象属性 为什么使用组合?===> 减少代码的冗余 class Person: school = 'oldboy' class Teacher(Person): def __init__(self,name,age,level,course): self.name=name self.age=age self.level=level #course是课程对象,表示老师教授的课程 self.course=course class

第二十六天Python学习记录

追加文件内容 mode = a 会加在文件内容后面 ab 以二进制方式追加 以r打开的文件是不能执行read操作的 混合模式  r+ 先读后写 类似于追加 w+  写读模式 先写后读 写之前会把之前的内容清空 文件的其他操作   fileno flush readable readline seek tell seekable (文件是否可执行seek操作) 修改文件 有两种方式  以r+ 方式打开  seek 找到位置,然后执行write 占硬盘的方式 1 import os 2 3 f_na

linux架构学习第二十六天之LAMP架构原理及搭建详解

内容: 1.何为LAMP 2.LAMP的架构以及通信过程 3.LAMP的搭建过程(rpm包) 4.基于LAMP搭建wordpress博客 一.何为LAMP LAMP(Linux-Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统,Apache网络服务器,MySQL数据库,Perl.PHP或者Python编程语言,所有组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采取这个架构,LAMP具有通用.跨平台.高性能.低价格的优势,因

第二十六天

今天打了一天的码.终于弄懂了一个关于按钮触发匿名函数,内部循环内容 ps[i].id=i;调用了标签数量同步第二个函数的结构. window.onload = function(){ var ps=document.getElementsByTagName("p"); var uls=document.getElementsByTagName("ul"); for(var i=0;i<ps.length;i++){ ps[i].id=i; ps[i].oncl

华为实习日记——第二十六天

7月8号那天有点事,今天补上吧. 上午到了之后就开始看人机交互,下午要考试. 10点钟的时候,我师父让我整理一下6月份的实习总结.师父和我说:“你6月份的输出有点少,这也怪我太忙,不过实习生也就是这样,第一个月学习,第二三个月才能看到输出.” 其实这只能怪自己,我入手比较慢我还是清楚的,也感谢我师父对我这么有耐心.像我师父这样性格好的大牛真的不多.要我是我师父的话我肯定就想,我怎么就摊上了这么坑师父的徒弟,整天啥都不会,还瞎JB乐乐乐,乐个锤子(`_´) 下午请假,回学校考人机交互,这是最后一门

Java基础--第二十六天

正则表达式的规则字符: A:字符 x 字符 x,任意字符代表自己本身. \\ 反斜线字符 \r      回车 \n     换行 B:字符类 [abc] a.b 或 c,任意字符一次. [^abc] 任何字符,除了 a.b 或 c [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内 [0-9] 任意的数字字符一次 C:预定义字符类 . 任意的字符 \d 数字:[0-9] \w 单词字符:[a-zA-Z_0-9] 单词字符:英文,数字,及_ D:边界匹配器 ^ 行的开头 $ 行的结