内容概要

  • 组合
  • 反射
  • 面向对象的内置函数
  • 异常

内容详细

一、组合

组合:在对象中定义一个属性,属性的值是另一个对象

除了继承父类的方法,这是获取另一个类中属性的另一种方式

如果想给学生对象添加课程属性:

1、直接把课程信息在调用阶段传入的话所需要的实参太多了,而且学生对象多需要不断重复传入

2、把课程信息放在People类里面的__init__初始化会给人的类添加了不属于它的课程属性

3、创建课程类,直接把课程类当作Student类的父类,不符合类的特性:学生不是课程类

所以解决以上方法,可以直接产生一个个课程对象,再把课程对象作为学生对象的值传给学生对象,这种方法就是组合

class People:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender class Course:
def __init__(self, name, period, price):
self.name = name
self.period = period
self.price = price # 产生课程对象
python = Course('python', '6mon', 20000)
Linux = Course('Linux', '5mon', 10000) class Student(People):
def __init__(self, name, age, gender, course=None):
if not course:
course = []
super().__init__(name, age, gender)
self.courses = course # 定义添加课程的方法
def choose_course(self, course):
self.courses.append(course) # 产生学生对象
stu = Student('elijah', 18, 'male')
# 把课程对象当作属性添加到学生对象的课程列表中
stu.choose_course(python)
stu.choose_course(Linux) # 这样就可以通过列表中的课程对象去获取相应的课程信息了
print(stu.courses[0].name) # python
print(stu.courses[0].period) # 6mon
print(stu.courses[0].price) # 20000

二、反射

1、getattr

获取对象中的属性值或者方法名,没有属性可以添加第三个参数返回None值

第一个参数是对象名,第二个参数是属性名或者方法名(用字符串的格式)

    stu.name
print(getattr(stu, 'name', None)) # 获取方法加括号可以直接调用
stu.func()
getattr(stu, 'choose_course')('linux')

2、setattr

给对象增加属性,第三个参数是属性的值

    stu,course = 'math'
setattr(stu, 'course', 'math')

3、hasattr

判断对象中是否有该属性,返回True或者False

hasattr(stu, 'name1')

4、delattr

删除对象中的属性

    delattr(stu, 'name')
print(stu.__dict__)

三、内置方法

1、__init__

	调用类会自动启动,用于初始化对象
class People:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender 2、__str__ 打印对象的时候会自动调用,而且该方法要有return返回值,返回值只能是字符串
# 在python中万物皆对象,可以尝试打印一些数据类型赋值的变量或者文件,会出现一连串输出格式,其实就是出发了__str__,早已经定好输出的格式 f = open('a.txt', 'w')
print(f) # <_io.TextIOWrapper name='a.txt' mode='w' encoding='cp936'> class People:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender def __str__(self):
return 'name: %s' % self.name p = People('elijah', 18, 'male')
print(p) # print(p.__str__()) 3、__del__ # 1、删除属性时会自动触发(手动执行)
# 2、程序执行完毕会触发
class People: def __init__(self, name, age):
self.name = name
self.age = age def __del__(self):
print('__del__') p = People('elijah', 18)
# del p
print('end====>') # 结果:先执行了__del__再执行了end===>, 说明在执行del的时候会触发__del__方法
# __del__
# end====> # 把del 删除操作注释掉: __del__在程序结束之后会执行
# end====>
# __del__ 作用:在程序中如果进行了文件打开操作open(),会占用系统资源且不会自动关闭,所以在程序运行结束之后可以在__del__方法下执行f.close()操作,把文件接口关闭 4、__enter__ 与 __exit__ (with语句中被触发) 上下文管理,出现with语句,对象的__enter__方法会被触发,有返回值则赋值给as声明的变量 with中程序结束后会执行__exit__方法
class Open():
def __init__(self, name):
self.name = name def __enter__(self):
print('with程序运行前执行') def __exit__(self):
# 在with语句执行完成后会运行__exit__方法,可以在__exit__方法中关闭文件
f.close()
print('with程序运行后执行') with Open('a.txt') as f 5、__call__
# 对象加括号自动触发
def __call__(self, *args, **kwargs):
print('__call__') stu()

四、异常

1. 什么是异常?

程序如果存在逻辑错误或者语法错误,在执行的时候会报出错误信号,并停止运行,异常之后的代码都不会执行

    异常的种类:
1. 语法错误
print(123
2. 逻辑错误
# 逻辑错误尽量写到完美
a = [1, 2, 3]
a[5]

2、 异常三个重要组成部分

1.traceback

翻到最下面从下往上的第一个蓝色字体鼠标左键点击即可跳转到错误的代码所在的行

2.XXXError

错误的类型

3.错误类型冒号后面的内容

错误的详细原因(很重要 仔细看完之后可能就会找到解决的方法)

3、异常处理

把有可能出错的代码放进异常处理的代码里,出错时会接收错误信息并可返回,继续执行剩余的代码

4、异常处理使用注意

1、尽量只在有可能出错的代码段才使用

2、异常处理中的代码越少越好

3、异常处理的频率越低越好

        try:
被监测代码
except 异常的类型:
pass
except 异常的类型:
pass
except 异常的类型:
pass
except Exception as e:
pass
else:
# 当被监测代码没有发生异常的时候,触发的
pass
finally:
不管被监测的代码有没有出错,都执行

组合&反射&面向对象内置函数的更多相关文章

  1. day28 面向对象:反射,内置函数,类的内置方法

    面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...

  2. python之反射和内置函数__str__、__repr__

    一.反射 反射类中的变量 反射对象中的变量 反射模块中的变量 反射本文件中的变量 .定义:使用字符串数据类型的变量名 来获取这个变量的值 例如: name = 'xiaoming' print(nam ...

  3. 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__

    反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...

  4. python---issubclass/type/isinstance/ 反射(内置函数getattr/delattr...)

    # 一 python面向对象-内置函数(issubclass(), type(), isinstance()) # issubclass 判断xxxx类是否是xxxx类的子类 class egg: p ...

  5. Python 面向对象 (补充) , 反射 , 内置函数

    面向对象中内置函数 issubclass方法: 检查第一个参数是否是第二个参数的子子孙孙类     返回  :   是一个布尔值 class Base(object): pass class Foo( ...

  6. python笔记4 内置函数,匿名函数.递归函数 面向对象(基础, 组合,继承)

    内置函数 eval和exec eval :执行字符串中的代码并将结果返回给执行者,有返回值 exec:执行字符串中的代码,往往用于执行流程语句,没有返回值. s1 = '1+2' s2 = 'prin ...

  7. python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法

    一.内置函数补充 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstan ...

  8. day26.面向对象-反射封装内置方法

    封装 隐藏对象的属性和实现细节,近对外提供公共访问方式 广义:代码保护,面向对象思想 狭义:将属性,方法隐藏起来 class Person: __key = 123456 # 私有的静态属性 def ...

  9. Python之路(第二十五篇) 面向对象初级:反射、内置方法

    [TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...

随机推荐

  1. 细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】

    1.前言 匿名内部类是什么东西? 没有名字的内部类就是匿名内部类. 什么场景使用? 匿名内部类适合创建那种只需要一次使用的类. 这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的 ...

  2. BugKu CTF(杂项篇MISC)-贝斯手

    打开是以下内容 先看一下给了哪些提示 1.介绍 没了?不,拉到最底下还有 2.女神剧照 密码我4不会告诉你的,除非你知道我的女神是哪一年出生的(细品) 大致已经明白了,四位数密码,出生年份 文件是以下 ...

  3. python极简教程04:进程和线程

    测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...

  4. warmup(HCTF 2018)

    为啥想写这道题的wp呢,因为这道题就是照着phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)复现出来的 题目 查看源码很容易找到source.php,直接访问 分析 题 ...

  5. Spring系列2:Spring容器基本概念和使用

    本文内容 简单回顾IoC和DI概念 Spring容器的概念 的xml配置和初始化 容器的基本使用 bean的定义和初始化配置 简单理解IoC和DI概念 什么是IoC控制反转? 通俗地但不严谨地讲,以前 ...

  6. Android官方文档翻译 九 2.2Adding Action Buttons

    Adding Action Buttons 增加动作按钮 This lesson teaches you to 这节课教给你 Specify the Actions in XML 在XML中指定动作 ...

  7. Solon 开发,四、Bean 扫描的三种方式

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  8. JQuery选择器的使用和分类

    jQuery选择器 id选择器格式 $("#box") //获取标签里的id是box的标签 类选择器格式 $(".a") //获取标签里的类名是a的标签 标签选 ...

  9. Java加减乘除计算器实现

    加减乘除计算机的实现 public static void main(String[] args) { while(true) { System.out.println("依次输入要计算的2 ...

  10. 【C++】STL容器

    STL容器 标签:c++ 目录 STL容器 容器的成员函数 所有容器都有的 顺序容器和关联容器 顺序容器(vector/string/list/deque) 容器 vector 构造函数 操作 set ...