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. Luogu 520题纪念

    一入OI深似海......

  2. hdu 2199 Can you solve this equation?(二分法求多项式解)

    题意 给Y值,找到多项式 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y 在0到100之间的解. 思路 从0到100,多项式是单调的,故用二分法求解. 代码 double c ...

  3. hdu 4786 Fibonacci Tree (最小、最大生成树)

    题意: N个点,M条边.每条边连接两个点u,v,且有一个权值c,c非零即一. 问能否将N个点形成一个生成树,并且这棵树的边权值和是一个fibonacii数. (fibonacii数=1,2,3,5,8 ...

  4. linux 的 逻辑卷管理

    lvm 逻辑卷管理器 关于逻辑卷管理lvm的一些操作 新建磁盘 sdcfdisk /dev/sdc 创建分区,更改分区id 为8e,改变分区类型为 lvm linux 创建物理卷与pv相关 pvcre ...

  5. 让 AI 为你写代码 - 体验 Github Copilot

    前几天在群里看到有大神分享 Copoilot AI 写代码,看了几个截图有点不敢相信自己的眼睛.今天赶紧自己也来体验一下 Copoilot AI 写代码到底有多神奇. 申请 现在 Copoilot 还 ...

  6. Java反射判断对象实例所有属性是否为空

    https://www.jb51.net/article/201647.htm public static Boolean ObjectAllFieldsEmpty(Object obj) throw ...

  7. MnogoDB唯一索引,稀疏索引

    1,单个字段唯一索引 db.collection.createIndex({name:1},{unique:true} 2,多个字段联合索引示例 db.collection.createIndex({ ...

  8. Android ANR从原理到日志分析,记下来就够了

    站在巨人的肩膀上可以看的更远 做一个优秀的搬运工 Android 彻底理解安卓应用无响应机制 Android ANR日志分析全面解析 优秀的文章不可独享,要扩散,要做好笔记,哈 <沁园春长沙&g ...

  9. 动态代理中newProxyInstance中三个参数

     JDK Proxy(代理对象): Proxy.newProxyInstance 方法的三个参数创建代理对象 增强 person对象 使用代理对象代替person 去执行 doCourt方法参数1 类 ...

  10. CSS基础-行快属性,hover

    CSS基础 1.行快属性 在css中有很多标签,分为行内标签,块标签,标签行内块标签,他们有着不同的属性.     块标签         div,ul,li,ol,h1~h6,p         可 ...