本周内容

组合 封装
多态
面向对象高级
异常处理
网络协议
通讯原理
互联网协议
TCP/UDP
基于TCP协议的套接字 上周回顾
1.xml,os,os.path
2.ATM+购物车
三层结构
3.面向对象与面向过程编程的对比

今日内容

1.面向对象的精髓

精髓是将数据和处理数据的代码绑定成了一个对象
只要获取到对象,相应的数据和方法都有了
class Mysql: def __init__(self,host,port,db,charset):
self.host = host
self.port = port
self.db = db
self.charset = charset def exc2(self,proc_name):
conn=connect(self.host,self.port,self.db,self.charset)
conn.call_proc(proc_name)
return 123 def exc1(self,sql):
conn=connect(self.host,self.port,self.db,self.charset)
conn.execute(sql)
return 123 my1 = Mysql("127.0.0.1",3306,"mydb","utf-8")
my1.exc1("select *from table1")
my1.exc2("名字")

2.组合

什么叫组合,多个对象放在一起叫组合
在程序中,一个对象将另一个对象作为自己的属性
组合 也可以降低代码的冗余 学生会增加各种各样的新的属性,比如手机,比如电脑,这样Student中会增加大量的属性和方法
class Person:
def __init__(self,name,sex,age,phonenumber,operator,address):
self.name = name
self.sex = sex
self.age = age self.phonenumber = phonenumber
self.operator = operator
self.address = address def call(self):
print("%s 正在拨号" % self.phonenumber) class Student(Person):
def __init__(self,name,sex,age,number,phonenumber,operator,address):
super().__init__(name, sex, age,phonenumber,operator,address)
self.number = number def show_info(self):
# print("name:%s sex:%s, age:%")
print(self.__dict__) def select_cursor(self):
print("%s 正在选课...." % self.name) class Teacher(Person):
def __init__(self,name,sex,age,salary,level,phonenumber,operator,address):
super().__init__(name,sex,age,phonenumber,operator,address)
self.salary = salary
self.level = level
def set_score(self):
print("%s 正在为学生打分..." % self.name) # 上述代码通过继承减少了代码冗余
# 需要给学生添加手机这个属性,(手机号码,运营商,归属地,可以打电话)
# 需要给学生添加电脑这个属性,(品牌,系统,CPU,内存,可以看视频,打游戏)
# stu = Student("李寻欢","女",20,"飞刀一班","18666666666","中国移动","上海浦东")
# print(stu.name)
# print(stu.phonenumber)
# stu = Student("李寻欢","女",20,"飞刀一班","18666666666","中国移动","上海浦东")
# stu.show_info() # 学生会增加各种各样的新的属性 比如手机 比如电脑, 这样Student中会增加大量的属性和方法 后期的维护成本非常高
这时候就需要使用组合来完成减少代码冗余 class Phone:
def __init__(self,phonenumber,operator,address):
self.phonenumber = phonenumber
self.operator = operator
self.address = address def call(self):
print("%s 正在拨号" % self.phonenumber) class Person:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age class Student(Person):
def __init__(self,name,sex,age,number):
super().__init__(name, sex, age)
self.number = number def show_info(self):
# print("name:%s sex:%s, age:%")
print(self.__dict__) def select_cursor(self):
print("%s 正在选课...." % self.name) class Teacher(Person):
def __init__(self,name,sex,age,salary,level):
super().__init__(name,sex,age)
self.salary = salary
self.level = level
def set_score(self):
print("%s 正在为学生打分..." % self.name) stu = Student("乔峰","男",38,"007")
# 学生买了一台手机 所以增加一个手机属性
p1 = Phone("1999999999","中国小米移动","上海浦东") stu.phone = p1
# 学生要打电话
stu.phone.call() # 通过将手机对象和学生对象进行组合 完成了需求,并且相比较继承而言
# 耦合度低 手机和学生在修改的时候 互不影响
# 同时也减少了代码冗余 # 继承是一种关系 什么是什么 学生是人类 老师是人类 (如果把手机相关内容插入到人类中,相当于学生是手机???)
# 组合是 对象之间的关系 学生对象拥有手机对象

3.封装

1.什么是封装
类似工厂拿个纸箱,装入一堆产品,拿胶带封起来
在程序中,封装指的是将内容隐藏起来,在面向对象中有什么内容可以被隐藏,就是属性和方法 注意:封装绝不是单纯的隐藏
封装是指,隐藏内部实现细节,对外提供使用接口
封装是为了明确区分内部和外部 2.为什么要封装
1.提高安全性 (cpu频率,缓冲区大小)
封装的例子(电脑,手机,汽车,收音机)
对于封装的属性而言,是通过给访问和修改增加额外的逻辑判断实现 2.封装是为了明确区分内部和外部 3.如何使用封装
在属性或方法前 加上两个下划线,就可以将其设置为私有的
另外补充:python中权限只有两种,公开(谁都能访问)和私有的(只有自己能访问的) 可以用对象的绑定方法,来返回封装的属性,如果直接返回的话,就没必要设置隐藏了,谁都可以通过调用方法来获取,我们在方法中加上自己的判断逻辑 即实现了隐藏,又提供了访问的接口,这就是封装的用法 class Student:
def __init__(self,name,sex,age,idCard):
self.name = name
self.age = age
self.sex = sex
self.__idCard = idCard
def say_hi(self):
print("hello i am %s age is : %s sex is %s" %
(self.name,self.age,self.sex)) def test(self):
print(self.__idCard) # 可以使用方法 将内部封装的内容返回出去
def get_idCard(self):
return self.__idCard # 如果直接返回的话 就没必要设置隐藏了 ,谁都可以通过调用方法来获取,我们再方法中加上自己的判断逻辑
def get_idCard2(self,pwd): # 如果密码正确我就给你身份证号码
if pwd == "1111":
return self.__idCard
else:
print("滚 你没有资格知道我的身份证...") def set_idCard(self,pwd,new_idCard): # 如果密码正确就允许修改
if pwd == "1111":
self.__idCard = new_idCard
else:
print("滚 你没有资格修改我的身份证...") stu = Student("步惊云","男",20,"3206661998445132")
stu.say_hi() print(stu.__idCard) # 加上__也访问不了 stu.test() # 但在内部是可以访问的
idcard = stu.get_idCard()
print(idcard)
# 即实现了隐藏 又提供了访问的接口 这就是封装的用法
# idcard = stu.get_idCard2("1111")
# print(idcard) # 身份证填错了 要修改
# stu.__idCard = "123" # 这样是无法修改原来的身份证信息的 而是添加了新的属性
print(stu.__idCard)
print(stu.get_idCard2("1111")) 调用方法来修改隐藏的属性
stu.set_idCard("1111","xxxxxxxxxxxxxxxxxx")
print(stu.get_idCard2("1111")) 总结:对于被隐藏的属性 访问和修改都需要通过方法 get用于获取 set用于设置(也称之为设置器和访问器)

day24 面向对象三大特性之封装的更多相关文章

  1. JAVA基础——面向对象三大特性:封装、继承、多态

    JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...

  2. Javascript面向对象三大特性(封装性、继承性、多态性)详解及创建对象的各种方法

    Javascript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation).继承(inheritance )和多态(polymorphism ).只不过实现 ...

  3. day24——面向对象三大特性、鸭子类型、类的约束、super的深度解析

    day24 面向对象的三大特性 继承.封装.多态 封装:把一堆东西(代码,数据)放到一个地方(空间),并且可以使用 class Student: def __init__(self, name, se ...

  4. C# 面向对象三大特性:封装、继承、多态

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了 ...

  5. java面向对象三大特性:封装、继承、多态

    一.封装 封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系.也就是说用户 ...

  6. Java入门系列(三)面向对象三大特性之封装、继承、多态

    面向对象综述 封装 封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口. 有了封装,就可以明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者:而外部调用者也可以知道 ...

  7. Java中面向对象三大特性之——封装

    概述 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改. 封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问.要访问该类的数据,必须通 ...

  8. python面向对象三大特性之一封装

    一.什么是封装 在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其 含义是其他程序无法调用. 要了解封装,离不开“私有化”,就是将类或者 ...

  9. C#面向对象三大特性:封装

    什么是封装 定义:把一个或多个项目封闭在一个物理的或者逻辑的包中.在面向对象程序设计方法论中,封装是为了防止对实现细节的访问. 封装的优点 1. 隔离性,安全性.被封装后的对象(这里的对象是泛指代码的 ...

随机推荐

  1. MIME Type和Content-Type

    告知浏览器:资源的媒体类型MIME Type: application/json HTTP协议中的媒体类型,由 Web服务器告知浏览器的,更准确地说,是通过响应头中的Content-Type表示.Co ...

  2. spark 常用技巧总结

    解析url scala> import java.net.URLimport java.net.URL scala> val urlstr="http://www.baidu.c ...

  3. 43. 根据某个字段查询的重复的记录,例:查testId重复的记录

    select t.* from test t    where t.testId in (select testIdfrom test group by testIdhaving count(test ...

  4. Address already in use: JVM_Bind 端口被占用的几个解决办法

    运行Tomcat时若出现Address already in use: JVM_Bind 端口被占用,一般使用下面几个办法可以解决: 假设端口为1099 1.启动cmd, 执行命令netstat -a ...

  5. Mac安装Python3报错Permission denied @ dir_s_mkdir - /usr/local/Frameworks

    brew安装Python3时出现的问题: Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks /usr/local/Frame ...

  6. ADOQuery.Parameters: Property Parameters does not exist

    Exception class EReadError with message 'Property Parameters does not exist'. Exception class EReadE ...

  7. Django - session 会话跟踪技术

    1.session简介 |session 英 /'seʃ(ə)n/ 美 /'sɛʃən/ 基于cookies开发,将值存到服务端 写session 读session Session是服务器端技术,利用 ...

  8. Java基础之用记事本编辑java代码运行,并且打成jar包后运行

    使用记事本写java代码 1.在d盘新建一个记事本,名字叫做zhanzhuang.java,会询问不可用,是否继续,点击是 2.在里面编辑就如下内容,注意文件的名字要和 class 后面的名字相对应 ...

  9. iOS多语言

    https://blog.csdn.net/huangmindong/article/details/53464334 App多语言,字符串统一放在 Localizable.strings 文件里. ...

  10. 初识AutoMapper

    在开始本篇文章之前,先来思考一个问题:一个项目分多层架构,如显示层.业务逻辑层.服务层.数据访问层.层与层访问需要数据载体,也就是类.如果多层通用一个类,一则会暴露出每层的字段,二者会使类字段很多,而 ...