day25 组合和内置函数
day25 组合和内置函数
一、组合
# 解决类与类之间代码冗余问题:
1. 继承
2. 组合
组合:一个对象拥有一个属性, 属性的值必须是另外一个对象
继承满足的是:什么是什么的关系 # is-a
组合满足的是:什么有什么的关系 # has-a
案例1:
class People:
school = 'SH'
def __init__(self,name,age,gender,sourse=None):
if sourse is None:
self.course = []
self.name = name
self.age = age
self.genter = gender
class Course():
def __init__(self,course_name,course_period,course_price):
self.course_name = course_name
self.course_period = course_period
self.course_price = course_price
python = Course('python','5mio',1000)
linux = Course('linux','6mio',2000)
# print(python.course_name) # python
# print(python.course_period) # 5mio
# print(python.course_price) # 1000
class Student(People):
school = 'SH'
def __init__(self,name,age,gender,course_name,course_period,courses_price,course=None):
if course is None:
self.course = []
self.course = course
super().__init__(name,age,gender)
# Course.__init__(self,course_name,course_period,courses_price)
def choose_course(self,course):
self.course.append(course)
print('%s选课成功%s'%(self.name,self.course))
stu = Student('meng',18,'male','python','5mio',2000)
# course = ['python','linux']
# stu.course.append(python.course_name)
# print(stu.course)
# stu.course.append(python)
# stu.course.append(linux)
# 让所有选择的课程打印出来
# for i in stu.course:
# print(i.course_name)
class Teachar(People):
school = 'SH'
def __init__(self,name,age,gender,level = None):
self.level = level
super().__init__(name,age,gender)
def score(self,stu_obj,score):
stu_obj.score = score
print('%s给%s打了%s分'%(self.name,stu_obj.name,score))
tea = Teachar('meng',18,'male')
tea.course = python
print(tea.course.course_name)
二、mixins机制
1. 分主类和辅类
2. 命名方式一般以 Mixin, able, ible 为后缀
3. 辅类位置一般在主类的左边
class Vehicle: # 交通工具
def run(self):
pass
def run1(self):
pass
def run2(self):
class FlyMixin():
# class Flyable():
def fly(self):
'''
飞行功能相应的代码
'''
print("I am flying")
class CivilAircraft(FlyMixin, Vehicle): # 民航飞机
pass
class Helicopter(FlyMixin, Vehicle): # 直升飞机
pass
class Car(Vehicle): # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
pass
import socketserver
三、内置函数
1.__init__函数:
总结__init__方法
'''
1、会在调用时自动触发执行,用来为对象初始化自己独有的数据
2、__init__内应该存放是为对象初始化属性的功能,但是是可以存放任意其他代码,
想要在类调用时就立刻执行的代码都可以放到该方法内
3、__init__方法必须返回None
'''
2.__str__函数:
总结__str__方法
'''
1. 打印对象会自定触发的函数,方法
2. 返回值必须是字符串类型
'''
例子:
class People:
school = 'SH'
# 1. 打印对象会自定触发的函数,方法
# 2. 返回值必须是字符串类型
def __str__(self):
return self.school
stu = People()
print(stu)
3.__del__函数:
总结__del__方法:
'''
1. 删除对象属性的时候,自动触发
2. 当所有代码执行完成之后,还会自动触发
'''
class People:
school = 'SH'
def __init__(self):
self.f = open('xxx',mode='w')
# 1. 删除对象属性的时候,自动触发
# 2. 当所有代码执行完成之后,还会自动触发
def __del__(self):
print('__del__')
self.f.close() # 可以自己执行
stu = People()
# stu.x = 1
# del stu.x
# print(stu)
print('=====>end')
4.判断类型的方法:isinstance
例子1:
s = 'abc'
print(type(s) is str) # True
print(isinstance(s,str)) #True
例子2:issubclass
class Foo:
pass
print(issubclass(Foo, object)) # 判断是FOO的子类,True
5.__getattr__、__setattr__、__delattr__函数
例子:
class Foo:
x = 1
def __init__(self, y):
self.y = y
# 当访问一个不存在的属性时候,会自定触发
def __getattr__(self, item):
print('----> from getattr:你找的属性不存在')
def __setattr__(self, key, value):
print('----> from setattr')
# print(key)
# print(value)
# self.key = value # 这就无限递归了,你好好想想
self.__dict__[key] = value # 应该使用它
def __delattr__(self, item):
print('----> from delattr')
# del self.item #无限递归了
self.__dict__.pop(item)
obj = Foo(10)
obj.z = 10
6.__call__函数(后面框架会用到)
总结__call__:当给对象加括号时候,自定触发的函数
例子:# 必须掌握
#################################__call__###########################
class Foo:
def __init__(self):
pass
# 当给对象加括号时候,自定触发的函数
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 执行 __init__
obj()
# obj.x = 1
# obj.'x' = 1
四、反射
1.getattr:在类里找不到属性,会返回第三个值
例子:
class People:
school = 'SH'
obj = People()
x = input('>>>').strip()
print(getattr(obj,x))
print(getattr(obj,'school','aa')) # 在类里找不到属性,会返回第三个值
输出结果:SH
2.setattr:字符串形式设置属性
例子:
class People:
school = 'SH'
obj = People()
setattr(obj,'y',10) # 输出结果为字典
print(obj.__dict__)
输出结果:{'y': 10}
3.dalattr:在类里面删除属性
例子:
class People:
school = 'SH'
obj = People()
dalattr(People,'school')
print(People,__dict__)
4.hasattr:如何判断是否有这个属性
例子1:
class People:
school = 'SH'
obj = People()
print(hasattr(obj,'school'))
输出结果:True
五、异常
# 什么是异常?
异常就是错误发生额的信号, 如果不对该信息进行处理, 那么, 之后的代码就不会运行
具体来说:
1. 语法错误
# SyntaxError:
print(123
2. 逻辑错误
# 有些逻辑错误可以尽量写到完美
NameError(未定义): name 'x' is not defined
IndexError(索引错误)
AttributeError(属性错误)
TypeError(类型错误)
# 为什么用异常?
为了增强代码的健壮性
# 怎么用异常?
try:
被监测的代码1
被监测的代码2
被监测的代码3
被监测的代码4
被监测的代码5
except 异常错误1 as e:
pass
except 异常错误2 as e:
pass
except 异常错误3 as e:
pass
else:
print("当被检测的代码没有异常的时候触发")
finally:
print("不管有咩有异常,都会走")
# 也可以抛出错误
a = [1,2,3]
if len(a) >= 5:
print(123)
else:
raise Exception('索引错误')
# 断言
a = [1,2,3]
assert len(a) == 5
2.限制子类的方法,除了ABC内置模块还有一种方法
class Animal():
def speak(self):
raise Exception("必须实现speak方法")
class People(Animal):
pass
obj = People()
obj.speak()
3.自定义异常类
# 自定义异常类
class MyException(BaseException):
def __init__(self,msg):
self.msg = msg
def __str__(self):
return self.msg
raise MyException('自定义异常类')
day25 组合和内置函数的更多相关文章
- python基础之函数式编程、匿名函数、内置函数
一 函数式编程 不修改外部状态. 模仿数学里得函数进行编程. 用函数编程写出得代码相当精简. 可读性比较差. 例子: y=2*x+1 x=1 def test(x): return 2*x+1 tes ...
- python匿名函数 与 内置函数
一.匿名函数 1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号 ...
- Py修行路 python基础 (十三)匿名函数 与 内置函数
一.匿名函数 1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是 ...
- Entity Framework 6 Recipes 2nd Edition(11-12)译 -> 定义内置函数
11-12. 定义内置函数 问题 想要定义一个在eSQL 和LINQ 查询里使用的内置函数. 解决方案 我们要在数据库中使用IsNull 函数,但是EF没有为eSQL 或LINQ发布这个函数. 假设我 ...
- Oracle内置函数:时间函数,转换函数,字符串函数,数值函数,替换函数
dual单行单列的隐藏表,看不见 但是可以用,经常用来调内置函数.不用新建表 时间函数 sysdate 系统当前时间 add_months 作用:对日期的月份进行加减 写法:add_months(日期 ...
- python内置函数
python内置函数 官方文档:点击 在这里我只列举一些常见的内置函数用法 1.abs()[求数字的绝对值] >>> abs(-13) 13 2.all() 判断所有集合元素都为真的 ...
- DAY5 python内置函数+验证码实例
内置函数 用验证码作为实例 字符串和字节的转换 字符串到字节 字节到字符串
- python之常用内置函数
python内置函数,可以通过python的帮助文档 Build-in Functions,在终端交互下可以通过命令查看 >>> dir("__builtins__&quo ...
- freemarker内置函数和用法
原文链接:http://www.iteye.com/topic/908500 在我们应用Freemarker 过程中,经常会操作例如字符串,数字,集合等,却不清楚Freemrker 有没有类似于Jav ...
随机推荐
- 关于把RTL工程代码封装成IP时对define宏定义参数的处理
在把RTL工程封装成IP的时候,如果工程中的代码中含有global include中定义的参数,则vivado不支持该参数文件的封装.出现IP_FLOW 19-4646的错误代码,解决方法: 1.在用 ...
- 寻找下一个结点 牛客网 程序员面试金典 C++ java Python
寻找下一个结点 牛客网 程序员面试金典 C++ java Python 题目描述 请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继). 给定树的根结点指针TreeNode* root ...
- python教程-(四)当索引行不通时(python字典)
一.创建和使用字典 1.函数dict #字典表示方式如下 >>> phonebook = {'tom':'18616271234',"Jim":"186 ...
- redis 的主从模式哨兵模式
原理理解 1,哨兵的作用就是检测redis主服务的状态,如果主服务器挂了,从服务就自动切换为主服务器,变为master.哨兵是一个独立的进程,作为进程,它会独立运行.其原理是哨兵通过发送命令,等待Re ...
- springcloud优雅停止上下线与熔断
SpringCloud 服务优雅上下线 Spring Boot 框架使用"约定大于配置"的特性,优雅流畅的开发过程,应用部署启动方式也很优雅.但是我们通常使用的停止应用的方式是 k ...
- linux 安装docker(一)
1.安装环境 此处在Centos7进行安装,可以使用以下命令查看CentOS版本 lsb_release -a 在 CentOS 7安装docker要求系统为64位.系统内核版本为 3.10 以上,可 ...
- initNativeTransServiceId . ntrans:object componentId :-368613127 微信小程序
二维码打开的页面是否存在 注意:体验版二维码默认路径是 pages/index/index 我的因为分包的原因调整了首页路径 所以路径是pages/tabBar/search/search 如果不是这 ...
- vscode 导入第三方jar包(添加外部JAR)
添加 jar包 至根目录下lib文件夹,在 .classpath 文件内添加 jar 路径. 注意:新添加的 jar路径 在"src"和"bin"之间,否则无法 ...
- feignclient各种使用技巧说明
FeignClient常见用法 常规的FeignClient的创建与使用我相信只要使用过spring cloud全家桶的套件的基本上都是非常熟悉了,我们只需定义一个interface,然后定义相关的远 ...
- 菜鸡的Java笔记 - java 双向一对多映射
双向一对多映射 two-way 开发要求: 根据数据表的结构进行简单java类的转换: 要求实现如下的输出信息: 可以根据课程取得全部参与 ...