python-面向对象精髓-组合-封装
2018-12-17 21:05
190 查看
文章目录
一、面向对象精髓
""" host = '127.0.0.1' port = 3306 db = 'db1' charset = "utf-8" # 在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset,sql): conn=connect(host,port,db,charset) conn.execute(sql) return 123 def exc2(host,port,db,charset,proc_name): conn=connect(host,port,db,charset) conn.call_proc(proc_name) return 123 exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;') exc2('127.0.0.1',3306,'db1','utf8','存储过程的名字') """ 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("名字") #精髓是将数据和处理数据的代码绑定成了一个对象 #只要获取到对象,相应的数据和方法都有了
二、组合
- 什么叫组合:多个对象放在一起叫组合
- 组合的好处:可以降低代码的冗余
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(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("张三", "男", 20, "一班") stu.show_info() #上述代码通过继承减少了代码冗余 #需要给学生添加手机这个属性(手机号码,运营商,归属地,可以打电话) ====================================================================== 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): < 1bb8c span class="token builtin">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) stu = Student("张三","男",20,"1号","18666666666","中国联通","黑龙江") stu.show_info() stu.call() #上述代码通过继承减少了代码冗余 #需要给学生添加手机这个属性(手机号码,运营商,归属地,可以打电话) #需要给学生添加电脑这个属性(品牌,系统,CPU,内存,可以看视频,打游戏) ================================================================= 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() #通过将手机对象和学生对象进行组合,完成了需求,并且相比较继承而言 #耦合度低手机和学生在修改的时候互不影响 #同时也减少了代码冗余
组合练习:
""" 用代码描述乐队,一个乐队有其他多个乐器组成,主唱 乐队可以演奏歌曲 主唱是歌手类:有名字,会唱歌 乐器是钢琴类:能弹奏,有价格,牌子 """ class Band: def __init__(self,name,singer,piano): self.name = name self.singer = singer self.piano = piano def play_music(self): print("hello 我们%s 组合! 请欣赏" % self.name) self.singer.singing() self.piano.playing() class Singer: def __init__(self,name): self.name = name def singing(self): print("你好我是歌手 ",self.name) class Piano: def __init__(self,price,brand): self.price = price self.brand = brand def playing(self): print("正在弹琴.....") # 发现一个歌手 singer = Singer("王俊元") # 买一台钢琴 p = Piano("10000","亚麻黑") # 组件乐队 b = Band("TFBoyss",singer,p) # 开演唱会 b.play_music()
三、封装
-
什么是封装:生活中的封装,类似工厂拿个纸箱,装入一堆产品,拿胶带封起来。在程序中,封装指的是将内容隐藏起来,在面向对象中有什么内容可以被隐藏?就是属性和方法
注意:封装绝对不是单纯的隐藏,封装是指隐藏内容实现细节,对外提供使用接口
-
为什么要封装:
提高安全性(例如:cpu频率 缓冲区大小,电脑,手机,汽车,收音机)
对于封装属性而言,是通过给访问和修改增加额外的逻辑判断来实现的
-
封装是为了明确区分内部和外部
如何使用封装:
在属性或方法名称前加上两个下划线就可以将其设置为私有的
属性的封装,通过需要提供相应的设置器和访问器
python中权限只有两种,公开的(谁都可以访问)和私有的(只有自己可以访问)
封装什么时候用:当一个类中有某些属性或方法不应该让外界直接访问,那就应该将其进行封装
封装的实现原理:本质上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() # 身份证填错了要修改 # stu.__idCard = "123" # 这样是无法修改原来的身份证信息的 而是添加了新的属性 # print(stu.__idCard) # print(stu.get_idCard2("1111")) #调用方法来修改隐藏的属性 stu.set_idCard("1111","xxxxxxxxxxxxxxxxxx") print(stu.get_idCard2("1111"))
总结:对于被隐藏的属性、访问、和修改都需要通过方法,get用于获取 ,set用于设置(也称之为设置器和访问器)
相关文章推荐
- Python-面向对象(组合、封装与多态)
- 第四百一十三节,python面向对象,组合、类创建的本质、依赖注入
- python的面向对象的特性(继承、封装、多态)
- Python面向对象之类的封装、继承与多态
- python 面向对象之封装与类与对象
- Python 面向对象之封装
- Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)
- python中面向对象--封装、继承、多态
- 面向对象(一)(封装,继承,多态,继承与组合,初始化块)
- python之面向对象之封装
- python面向对象(二)之封装
- Python 学习笔记 - 面向对象(封装,继承和多态)
- python3 全栈开发 -- 面向对象 类的组合和封装
- Objective-C----MRC内存管理 、 自动释放池 、 面向对象三大特性及封装 、 继承 、 组合与聚合
- python面向对象之封装
- Python面向对象之封装、property特性、绑定方法与非绑定方法
- Python(十三)面向对象 -封装
- Python学习(七)面向对象 ——封装
- Python基础(面向对象之封装与继承)
- python面向对象(二)之封装