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 组合和内置函数的更多相关文章

  1. python基础之函数式编程、匿名函数、内置函数

    一 函数式编程 不修改外部状态. 模仿数学里得函数进行编程. 用函数编程写出得代码相当精简. 可读性比较差. 例子: y=2*x+1 x=1 def test(x): return 2*x+1 tes ...

  2. python匿名函数 与 内置函数

      一.匿名函数  1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号 ...

  3. Py修行路 python基础 (十三)匿名函数 与 内置函数

    一.匿名函数  1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是 ...

  4. Entity Framework 6 Recipes 2nd Edition(11-12)译 -> 定义内置函数

    11-12. 定义内置函数 问题 想要定义一个在eSQL 和LINQ 查询里使用的内置函数. 解决方案 我们要在数据库中使用IsNull 函数,但是EF没有为eSQL 或LINQ发布这个函数. 假设我 ...

  5. Oracle内置函数:时间函数,转换函数,字符串函数,数值函数,替换函数

    dual单行单列的隐藏表,看不见 但是可以用,经常用来调内置函数.不用新建表 时间函数 sysdate 系统当前时间 add_months 作用:对日期的月份进行加减 写法:add_months(日期 ...

  6. python内置函数

    python内置函数 官方文档:点击 在这里我只列举一些常见的内置函数用法 1.abs()[求数字的绝对值] >>> abs(-13) 13 2.all() 判断所有集合元素都为真的 ...

  7. DAY5 python内置函数+验证码实例

    内置函数 用验证码作为实例 字符串和字节的转换 字符串到字节 字节到字符串

  8. python之常用内置函数

    python内置函数,可以通过python的帮助文档 Build-in Functions,在终端交互下可以通过命令查看 >>> dir("__builtins__&quo ...

  9. freemarker内置函数和用法

    原文链接:http://www.iteye.com/topic/908500 在我们应用Freemarker 过程中,经常会操作例如字符串,数字,集合等,却不清楚Freemrker 有没有类似于Jav ...

随机推荐

  1. Kill杀死Linux中的defunct进程(僵尸进程)

    一.什么是defunct进程(僵尸进程)? 在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状 ...

  2. single-number-ii leetcode C++

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  3. hdu 1394 Minimum Inversion Number(线段树or树状数组)

    题意: 给你N个数,N个数是0~N-1的一个全排列. 要求统计它的所有形式的逆序对的最小值.它的所有形式的意思是,不断将数组开头的第一个数放到数组的最后面. 逆序对:i<j且ai>aj 思 ...

  4. 修改 openssh 版本号

    1.查看 sshd 位置 #which sshd 2.查看 /usr/sbin/sshd(二进制文件) 内容 #strings /usr/sbin/sshd | grep nicai 3.修改版本号, ...

  5. 🔥完美解决ESlint+Prettier各项配置冲突的语法报错问题(新手向)

    本文重点: 1.解决修改了Prettier默认配置,项目内格式化无法生效 2.解决Prettier缺少配置,函数名和括号之间,自动添加空格 3.settings.json配置项分享 一个程序员,可能非 ...

  6. Qt 隐藏标题栏后实现窗口拖动、设置窗口透明

    隐藏标题栏 setWindowFlags(Qt::CustomizeWindowHint); setWindowFlags(Qt::FramelessWindowHint); 两个函数都可以去掉标题栏 ...

  7. Mysql - 如何决定用 datetime、timestamp、int 哪种类型存储时间戳?

    背景 数据表都很可能会有一两个字段需要保存日期时间数据,那应该用什么 Mysql 类型来保存呢? 前面讲过 datetime.timestamp.int 的方式来保存日期时间 如何存储 10位.13位 ...

  8. HttpClient用法--这一篇全了解(内含例子)

    HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅使客户端发送Http请求变得容易,而且也方便开发人员测试接口(基于Http协议的),提高了开发的效率,也 ...

  9. Django 小实例S1 简易学生选课管理系统 12 CSS样式完善

    Django 小实例S1 简易学生选课管理系统 第12节--CSS样式完善 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块的逻辑代码到这里 ...

  10. java-TCP协议发送和接收数据

    TCP协议接收数据的步骤: A:创建接收数据的Socket对象 创建对象的时候要指定端口 B:监听客户端连接 等待客户端连接 C:获取Socket对象的输入流(字节流) D:读数据,并显示在控制台 E ...