CSIC_716_20191127【组合,封装、类的私有属性方法、property装饰器】
组合
what? 组合是指一个对象中,包含另一个或多个对象。
why? 减少代码的冗余。
How? 在类中加入其他类的对象,实现跨类对象之间的联动。
耦合度 软件设计要 高内聚,低耦合。
耦合度越高,程序的可扩展性越低
耦合度越低,程序的可扩展性越高
继承与组合的区别:
继承代表【是】的关系,是类和类之间的关系,老师类是人类,学生类是人类。子类和父类是从属关系。
组合代表【有】的关系,是对象和对象之间的关系,老师对象 有 课对象,学生对象 有 课对象。表示拥有某种属性或者方法。
组合
组合的精髓在与将一个对象作为某个类的特有属性,然后通过该特有属性(赋的是其他类的对象的值)再去调用对象所在类的方法,实现多种功能的拼接。
举例:
# _*_ coding: gbk _*_
# @Author: Wonder
'''
练习需求:
选课系统:
1.有学生、老师类,学生与老师有属性 “名字、年龄、性别、 课程”,
2.有方法 老师与学生可以添加课程, 打印学习/教授课程。 # 组合实现
''' class People:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender def add_course(self, course_obj):
self.course_list.append(course_obj) def course_info(self):
for course_obj in self.course_list:
course_obj.show()#通过对象去找该对象能取到的方法 class Teacher(People):
def __init__(self, name, age, gender):
super().__init__(name, age, gender)
self.course_list = [] #存放交互对象的容器 class Student(People):
def __init__(self, name, age, gender):
super().__init__(name, age, gender)
self.course_list = [] class Course:
def __init__(self, course_name, course_price, course_cycle):
self.course_name = course_name
self.course_price = course_price
self.course_cycle = course_cycle def show(self):
print(f'''
=======选的课为:=======
course_name = {self.course_name}
course_price = {self.course_price}
course_cycle = {self.course_cycle}
''') t1 = Teacher('abc', 19, 'male')
python_obj = Course('PYTHON', 10000, '6month') # 统一称之为course_obj
go_obj = Course('GO', 5000, '4month')
t1.add_course(python_obj)
t1.add_course(go_obj)
t1.course_info() t1永远只会调用自己本身或者父类的函数,组合的类,由组合的对象去调用
封装
什么是封装:将一堆属性和方法封装到对象中去,可以通过【对象名.】的方式进行调用。
封装使得对数据的提取更加方便。
封装中的访问限制机制
what 凡是在类内部定义的属性和方法,以__开头的属性和方法,都会被限制,外部不能直接使用该属性原型。类似于将该属性或方法隐藏起来了。通过在属性或函数前面加上 _ _将该属性或方法隐藏起来, 本质上是一种变形操作。 _ _name 等价于 _ 类名_ _ 属性名
why 可以将一些隐私数据隐藏起来,不让外部轻易获取。
可以将一堆数据封装成接口,让用户直接调用,并通过相应的逻辑,最后将数据返回。
how :如果知道类名以及被隐藏是数据或者方法名,可以通过【_类名__属性/方法名】进行调用
例如 :
# _*_ coding: gbk _*_
# @Author: Wonder
class People:
__school = 'HEU' def __init__(self, name, age, gender):
self.__name = name
self.__age = age
self.__gender = gender def __show(self):
print('隐藏了吗') human1 = People('wonder', 19, 'male')
print(human1.__school) #People' object has no attribute '__school'
print(human1._People__school) #HEU print(human1.__name) # AttributeError: 'People' object has no attribute '__name'
print(human1._People__name) #wonder human1.__show() # AttributeError: 'People' object has no attribute '__show'
human1._People__show() # 隐藏了吗
用_ _隐藏的主要目的是想将属性或者方法限制在类中使用,不想被外界调用。
property本质上是一个装饰器,用来装饰类内部的方法(在被装饰方法上方,使用语法糖@property,进而将 原先的【类名.方法名()】调用方式改变为【类名.方法名】
如果被property装饰过的方法,想要改变他的值,只可以通过@被装饰方法名.setter以及@被装饰方法名.deleter进行修改和删除操作。
# _*_ coding: gbk _*_
# @Author: Wonder
# class Securty:
# def __init__(self, name, gender, height, weight):
# self.__name = name
# self.gender = gender
# self.height = height
# self.weight = weight
#
# def hw(self):
# return (self.height + self.weight)
#
# @property
# def sex(self):
# return self.gender
#
# @property
# def namey(self):
# return self.__name # s1 = Securty('wonder', 'male', 190, 200)
# print(s1.hw()) # 390
# print(s1.sex()) # TypeError: 'str' object is not callable
# print(s1.sex) # male
# print(s1.namey) # wonder
__name是可以被return出来的。见上面红色背景的语句及执行结果。
# 想修改或删除被property装饰的属性
class Sure:
def __init__(self, name, ):
self.__name = name @property
def namey(self):
return self.__name @namey.setter
def namey(self, value):
if not isinstance(value, str):
raise TypeError('FUCK_NO')
self.__name = value @namey.deleter
def namey(self):
# del self.__name # 执行删除操作
# 如果将改为raise TypeError('forbidden')
raise TypeError('forbidden') name1 = Sure('GOOGLE')
print(name1.namey) # GOOGLE
name1.namey = 'YAHOO' # 修改值操作
print(name1.namey) # YAHOO
del name1.namey #删除操作
print(name1.namey) # 如果删除了,则会报错AttributeError: 'Sure' object has no attribute '_Sure__name'。否则还是YAHOO
CSIC_716_20191127【组合,封装、类的私有属性方法、property装饰器】的更多相关文章
- 通过decorators = [,] 的形式给类中的所有方法添加装饰器
给类添加装饰器有多种方法: 1.可以在类中的某个方法上边直接@添加,这个粒度细.无需详细介绍 2.也可以在类中通过 decorators=[, ]的形式添加,这样的话,类中的所有方法都会被一次性加上装 ...
- 面向对象之封装 及@property装饰器使用
目录 封装 1.封装的定义 2.封装的目的: 3.封装的三种方式 4.封装的优点 5.访问限制(封装) @property 装饰器 属性property底层实现 封装 1.封装的定义 将复杂的丑陋的, ...
- Python类总结-封装(私有属性,方法)
封装基础 广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装 只让自己的对象能调用自己类中的方法 狭义上的封装-面向对象三大特性之一(私有变量,用公有的方法封装私有属性,方法叫封装) 把 ...
- 访问类的私有属性(RTTI和模仿类2种方法)
如何访问类的私有属性? 下面以 TPathData 为例,它有一个私有属性 PathData,储存了每一个曲线点,但一般无法修改它,需要利用下面方法,才能访问修改(若有更好的方法,歡迎分享): 一.利 ...
- python 类的私有属性和方法 (转载)
转载:http://www.runoob.com/python/python-object.html 类属性与方法 类的私有属性 __private_attrs:两个下划线开头,声明该属性为私有,不能 ...
- Java使用PropertyDescriptor获取实体类中私有属性的值,并给私有属性赋值
大家都知道Java类中的私有的(private)属性是获取不到的(即使使用继承依然获取不到),那如果非要获取私有属性的值怎么办呢?一般的做法是将该java类封装称为一个JavaBean,即封装该私有属 ...
- python面向编程:类的组合、封装、property装饰器、多态
一.组合 二.封装 三.propert装饰器 四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 ...
- Python类的私有属性
class Bar(object): __age = 18 sex = 'male' def __init__(self, ): pass def f(self): print(self.__age) ...
- 面向对象之组合、封装、多态、property装饰器
概要: 组合 封装 property装饰器 多态 Python推崇鸭子类型:解耦合,统一标准(不用继承) 1. 组合 继承:会传递给子类强制属性 组合:解耦合,减少占用内存.如:正常继承,如果一个班级 ...
随机推荐
- oracle入门学习之oracle数据库结构
1. oracle数据库结构 1.1 Oracle可以看做是一个大的数据库???,里面可以创建很多实例; 一个实例对应多个表空间.多个用户; 一个用户只能有一个表空间; 一个表空间可以有多个用户; 一 ...
- icomoon字体图标引用代码
1.第一步在样式里声明字体:告诉别人我们自己定义的字体. @font-face{ /*声明字体 引用字体*/ font-family:'icomoon'; src:url('fonts/icomoon ...
- 使用eclipse开发java web网页
前面说了手动配置一个应用,手动配置可以更深入的理解web应用的分布,但是一般的编辑器没有语法错误提示,所以开发起来对于错误的寻找不太容易,效率相对较低,所以在理解清楚web项目的结构之后,我们使用ec ...
- vue子组件获取父组件方法
注:以下代码未使用esLint语法检查 父组件: <template> <div class="wrapper"> <cp_action @paren ...
- leetcode-13双周赛-1257-最小公共区域
题目描述: 方法: class Solution(object): def findSmallestRegion(self, regions, region1, region2): parent = ...
- Oracle系列教程之一软件安装与卸载
1.安装软件 软件下载地址:https://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html ...
- 每天一个Linux命令:man(0)
man man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助.配置文件帮助和编程帮助等信息. 格式 man [-adfhktwW] [section] [-M path] ...
- 同源策略 - JSONP - CORS
1. Jquery 对象可以通过 .index() 进行取出自当前元素在父级元素中存放的索引: 2. 浏览器的同源策略 -- Ajax 在访问非本网站的时候,在数据返回的时候,会被浏览器拦截 - 后 ...
- Shiro学习(15)单点登录
Shiro 1.2开始提供了Jasig CAS单点登录的支持,单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录.此处我们使用Ja ...
- xml配置离线约束的目的和ecplipse离线约束配置
正常情况下如果电脑已经联网的情况下,Spring的核心配置文件编写内容的时候是可以自动提示的,假设电脑如果离线情况下想要自动提示的话,就得配置离线约束文件. https://blog.csdn.net ...